(七)[重制]C++命名空间与标准模板库(STL)

引言

在专栏C++教程的第六篇C++中的结构体与联合体中,介绍了C++中的结构体和联合体,包括它们的定义、初始化、内存布局和对齐,以及作为函数参数和返回值的应用。在专栏C++教程的第七篇中,我们将深入了解C++中的命名空间(namespace)和标准模板库(STL)的相关概念和应用

C++ 命名空间(namespace)

C++ 命名空间在软件开发中起着至关重要的作用,特别是在大型项目中。命名空间的主要作用是解决全局名称冲突的问题。在大型项目中,不同模块可能定义了相同名称的函数、变量或类。通过将这些实体分别放入不同的命名空间内,可以在全局范围内区分它们。接下来,我们将详细介绍命名空间的相关内容,并通过生动有趣的示例来帮助理解。

1. 命名空间的作用

想象一下你正在开发一个复杂的应用程序,其中包括多个模块,如账户管理、交易处理、报告生成等。每个模块都有自己的一组函数和类,例如,Account 类在账户管理模块中用于表示用户账户,而在交易处理模块中,可能也有一个 Transaction 类表示金融交易。如果不使用命名空间,这些类名可能会发生冲突,从而导致编译错误或意外行为。

为了避免这种情况,我们可以将每个模块的代码放入不同的命名空间中:

namespace AccountManagement {class Account {// 账户管理相关代码};
}namespace TransactionProcessing {class Transaction {// 交易处理相关代码};
}

通过这种方式,即使两个模块中都有同名的类,它们也不会冲突。我们可以通过命名空间限定符来区分它们:

AccountManagement::Account myAccount;
TransactionProcessing::Transaction myTransaction;

2. 命名空间成员访问方式

在使用命名空间时,我们有多种方式访问其中的成员。

显式作用域解析运算符

最直接的方式是使用作用域解析运算符 :: 来显式指定命名空间:

namespace MyNamespace {void function() {// 函数实现}
}int main() {MyNamespace::function(); // 显式调用命名空间内的函数return 0;
}

using 声明

我们也可以使用 using 声明将特定的命名空间成员导入到当前作用域,这样就可以直接使用这些成员而无需每次都写命名空间前缀:

namespace MyNamespace {void function() {// 函数实现}
}using MyNamespace::function; // 导入特定函数到当前作用域int main() {function(); // 现在可以直接调用return 0;
}

using 指令

using namespace 语句用于导入整个命名空间的内容到当前作用域。尽管方便,但在头文件中使用可能会导致污染全局命名空间,增加编译错误和维护难度。因此,一般建议仅在实现文件中使用 using namespace,而在头文件中尽量避免。

namespace MyNamespace {void function() {// 函数实现}
}// 在 cpp 文件中使用
using namespace MyNamespace;int main() {function(); // 直接调用return 0;
}

3. 内联命名空间

C++11 引入了内联命名空间(inline namespace),它的主要特点是链接时不会创建新的作用域,而是保留原作用域。内联命名空间主要用于版本控制和 ABI 兼容性问题。

假设你在开发一个库,并希望在新版本中添加一些功能,但不希望破坏与旧版本的兼容性。你可以使用内联命名空间来实现这一点:

namespace MyLibrary {inline namespace v1 {void function() {// 旧版本实现}}inline namespace v2 {void function() {// 新版本实现}}
}int main() {MyLibrary::function(); // 调用新版本的实现return 0;
}

通过这种方式,用户可以选择性地使用旧版本或新版本的实现,而无需修改代码。

4. 匿名命名空间

匿名命名空间中的所有内容具有内部链接属性,意味着它们只在同一编译单元可见,这有助于实现文件私有数据。匿名命名空间常用于定义只在当前文件中使用的辅助函数或变量,避免它们在全局范围内被意外使用。

namespace {void helperFunction() {// 辅助函数实现}
}int main() {helperFunction(); // 调用匿名命名空间内的辅助函数return 0;
}

使用匿名命名空间可以有效地避免命名冲突,并确保辅助函数或变量只在当前文件中可见。

C++ 标准模板库(STL)详解

C++ 标准模板库(STL)是 C++ 标准库的一部分,提供了一组常用的数据结构和算法。STL 的设计原则是泛型编程,通过模板实现通用的容器和算法,使代码更加灵活和可重用。接下来,我们将详细介绍 STL 的各个方面,并通过生动有趣的示例来帮助理解。

1. STL 容器

STL 容器是 STL 的核心组件之一,每个容器都有其独特的特性和适用场景。以下是常用 STL 容器的介绍及示例。

std::vector

std::vector 是一种动态数组,支持高效的随机访问。它的插入和删除操作可能会导致元素移动,因此在需要频繁插入和删除的场景中性能不如链表。

#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 访问元素std::cout << "Element at index 2: " << vec[2] << std::endl;// 插入元素vec.push_back(6);std::cout << "Last element: " << vec.back() << std::endl;// 删除元素vec.pop_back();std::cout << "After pop_back, last element: " << vec.back() << std::endl;return 0;
}

std::deque

std::deque 是一种双端队列,支持在两端进行高效的插入和删除操作。它既可以用作栈,也可以用作队列。

#include <deque>
#include <iostream>int main() {std::deque<int> deq = {1, 2, 3, 4, 5};// 访问元素std::cout << "Element at index 2: " << deq[2] << std::endl;// 在前端插入元素deq.push_front(0);std::cout << "First element: " << deq.front() << std::endl;// 在后端插入元素deq.push_back(6);std::cout << "Last element: " << deq.back() << std::endl;// 删除前端元素deq.pop_front();std::cout << "After pop_front, first element: " << deq.front() << std::endl;return 0;
}

std::list

std::list 是一种双向链表,支持高效的插入和删除操作,但不支持随机访问。它适用于需要频繁插入和删除元素的场景。

#include <list>
#include <iostream>int main() {std::list<int> lst = {1, 2, 3, 4, 5};// 遍历元素for (int elem : lst) {std::cout << elem << " ";}std::cout << std::endl;// 插入元素auto it = lst.begin();std::advance(it, 2);lst.insert(it, 10);// 删除元素lst.erase(it);// 遍历元素for (int elem : lst) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

std::set 和 std::map

std::setstd::map 是基于红黑树实现的有序容器,键唯一,自动排序。std::set 仅包含键,而 std::map 包含键值对。

#include <set>
#include <map>
#include <iostream>int main() {// std::set 示例std::set<int> mySet = {5, 3, 8, 1};mySet.insert(4);for (int elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;// std::map 示例std::map<int, std::string> myMap;myMap[1] = "one";myMap[2] = "two";myMap[3] = "three";for (const auto& pair : myMap) {std::cout << pair.first <<" => " << pair.second << std::endl;}return 0;
}

std::multiset 和 std::multimap

std::multisetstd::multimap 允许键重复,其他特性与 std::setstd::map 相同。

#include <set>
#include <map>
#include <iostream>int main() {// std::multiset 示例std::multiset<int> myMultiSet = {5, 3, 8, 1, 3, 5};for (int elem : myMultiSet) {std::cout << elem << " ";}std::cout << std::endl;// std::multimap 示例std::multimap<int, std::string> myMultiMap;myMultiMap.insert({1, "one"});myMultiMap.insert({2, "two"});myMultiMap.insert({1, "uno"});for (const auto& pair : myMultiMap) {std::cout << pair.first << " => " << pair.second << std::endl;}return 0;
}

适配器容器

适配器容器是对其他容器的封装,提供特定的接口,例如栈(stack)、队列(queue)和优先级队列(priority_queue)。

#include <stack>
#include <queue>
#include <iostream>int main() {// 栈示例std::stack<int> myStack;myStack.push(1);myStack.push(2);myStack.push(3);while (!myStack.empty()) {std::cout << myStack.top() << " ";myStack.pop();}std::cout << std::endl;// 队列示例std::queue<int> myQueue;myQueue.push(1);myQueue.push(2);myQueue.push(3);while (!myQueue.empty()) {std::cout << myQueue.front() << " ";myQueue.pop();}std::cout << std::endl;// 优先级队列示例std::priority_queue<int> myPriorityQueue;myPriorityQueue.push(3);myPriorityQueue.push(1);myPriorityQueue.push(2);while (!myPriorityQueue.empty()) {std::cout << myPriorityQueue.top() << " ";myPriorityQueue.pop();}std::cout << std::endl;return 0;
}

2. STL 算法

STL 提供了丰富的算法库,包括非修改序列算法、修改序列算法、排序算法、数值算法等。这些算法通常与迭代器配合使用。

非修改序列算法

非修改序列算法不会改变容器的内容,它们通常用于查找、统计和检查元素。

#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 3};// 查找元素auto it = std::find(vec.begin(), vec.end(), 3);if (it != vec.end()) {std::cout << "Found 3 at index " << std::distance(vec.begin(), it) << std::endl;} else {std::cout << "3 not found" << std::endl;}// 统计元素个数int count = std::count(vec.begin(), vec.end(), 3);std::cout << "Number of 3s: " << count << std::endl;// 检查是否所有元素都大于 0bool allPositive = std::all_of(vec.begin(), vec.end(), [](int x) { return x > 0; });std::cout << "All elements are positive: " << (allPositive ? "true" : "false") << std::endl;return 0;
}

修改序列算法

修改序列算法会改变容器的内容,它们包括排序、复制、替换等操作。

#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {4, 2, 5, 1, 3};// 排序std::sort(vec.begin(), vec.end());std::cout << "Sorted vector: ";for (int elem : vec) {std::cout << elem << " ";}std::cout << std::endl;// 反转std::reverse(vec.begin(), vec.end());std::cout << "Reversed vector: ";for (int elem : vec) {std::cout << elem << " ";}std::cout << std::endl;// 复制std::vector<int> vec2(vec.size());std::copy(vec.begin(), vec.end(), vec2.begin());std::cout << "Copied vector: ";for (int elem : vec2) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

排序算法

STL 提供了一些高级排序算法,例如 std::sortstd::stable_sort

#include <vector>
#include <algorithm>
#include <iostream>int main() {std::vector<int> vec = {4, 2, 5, 1, 3};// 使用 std::sort 排序std::sort(vec.begin(), vec.end());std::cout << "Sorted vector: ";for (int elem : vec) {std::cout << elem << " ";}std::cout << std::endl;// 使用 std::stable_sort 排序,保留相等元素的相对顺序std::stable_sort(vec.begin(), vec.end());std::cout << "Stable sorted vector: ";for (int elem : vec) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

数值算法

STL 还提供了一些数值算法,如 std::accumulate 用于求和,std::partial_sumstd::adjacent_difference 用于累积和差分。

#include <vector>
#include <numeric>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 求和int sum = std::accumulate(vec.begin(), vec.end(), 0);std::cout << "Sum: " << sum << std::endl;// 部分和std::vector<int> partialSums(vec.size());std::partial_sum(vec.begin(), vec.end(), partialSums.begin());std::cout << "Partial sums: ";for (int elem : partialSums) {std::cout << elem << " ";}std::cout << std::endl;// 相邻差分std::vector<int> differences(vec.size());std::adjacent_difference(vec.begin(), vec.end(), differences.begin());std::cout << "Adjacent differences: ";for (int elem : differences) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

3. STL 迭代器

迭代器是 STL 的核心概念之一,它提供了访问容器内元素的一致接口。STL 迭代器类似于指针,但具有更多的功能。根据迭代器的能力,它们分为以下几种类型:

输入迭代器

输入迭代器只能读取元素并单向前进,适用于单次遍历序列的操作。

#include <vector>
#include <iostream>
#include <iterator>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用输入迭代器遍历向量for (std::istream_iterator<int> it(std::cin), end; it != end; ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

输出迭代器

输出迭代器只能写入元素并单向前进,适用于将结果输出到序列的操作。

#include <vector>
#include <iostream>
#include <iterator>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用输出迭代器将向量元素输出到标准输出std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));std::cout << std::endl;return 0;
}

前向迭代器

前向迭代器除了输入迭代器的功能外,还可以前进后再次前进,适用于多次遍历序列的操作。

#include <vector>
#include <iostream>
#include <iterator>int main() {std::vector<int> vec = {1, 2,3, 4, 5};// 使用前向迭代器遍历向量for (std::forward_list<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

双向迭代器

双向迭代器不仅可以前进,还可以后退,适用于需要双向遍历序列的操作。

#include <list>
#include <iostream>int main() {std::list<int> myList = {1, 2, 3, 4, 5};// 使用双向迭代器遍历列表for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 反向遍历列表for (std::list<int>::reverse_iterator it = myList.rbegin(); it != myList.rend(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

随机访问迭代器

随机访问迭代器可以直接跳转到任意位置,适用于数组和向量等支持随机访问的容器。

#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用随机访问迭代器访问向量元素for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 直接跳转到任意位置std::vector<int>::iterator it = vec.begin() + 2;std::cout << "Element at index 2: " << *it << std::endl;return 0;
}

4. STL 函数对象和谓词

STL 中的函数对象和谓词提供了灵活的函数调用方式。函数对象是行为类似函数的对象,谓词是返回布尔值的函数对象。

函数对象

函数对象是重载了 operator() 的类对象,可以像函数一样被调用。

#include <vector>
#include <algorithm>
#include <iostream>class MultiplyBy {
public:MultiplyBy(int factor) : factor(factor) {}int operator()(int x) const {return x * factor;}
private:int factor;
};int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::vector<int> result(vec.size());// 使用函数对象进行元素变换std::transform(vec.begin(), vec.end(), result.begin(), MultiplyBy(2));std::cout << "Transformed vector: ";for (int elem : result) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

谓词

谓词是返回布尔值的函数对象,分为一元谓词和二元谓词。

#include <vector>
#include <algorithm>
#include <iostream>class IsEven {
public:bool operator()(int x) const {return x % 2 == 0;}
};class IsGreater {
public:IsGreater(int value) : value(value) {}bool operator()(int x) const {return x > value;}
private:int value;
};int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 6};// 使用一元谓词auto it = std::find_if(vec.begin(), vec.end(), IsEven());if (it != vec.end()) {std::cout << "First even number: " << *it << std::endl;} else {std::cout << "No even numbers found" << std::endl;}// 使用二元谓词it = std::find_if(vec.begin(), vec.end(), IsGreater(4));if (it != vec.end()) {std::cout << "First number greater than 4: " << *it << std::endl;} else {std::cout << "No numbers greater than 4 found" << std::endl;}return 0;
}

绑定器和函数适配器

STL 提供了绑定器和函数适配器,用于调整函数对象和谓词的行为。

#include <vector>
#include <algorithm>
#include <iostream>
#include <functional>int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 6};// 使用 std::bindauto it = std::find_if(vec.begin(), vec.end(), std::bind(std::greater<int>(), std::placeholders::_1, 4));if (it != vec.end()) {std::cout << "First number greater than 4: " << *it << std::endl;} else {std::cout << "No numbers greater than 4 found" << std::endl;}return 0;
}

总结

本文详细探讨了C++中命名空间和标准模板库(STL)的重要概念及其实际应用:

在命名空间部分,我们学习了命名空间的基本作用,即解决全局名称冲突的问题,通过显式作用域解析运算符和using声明的方式来访问命名空间中的成员。讨论了使用using namespace带来的便利性和潜在的命名冲突问题,以及C++11引入的内联命名空间和匿名命名空间的用法和优势。

在STL部分,我们深入研究了各种STL容器的特性和适用场景,如动态数组vector、双端队列deque、双向链表list,以及基于红黑树的关联容器set和map。我们介绍了STL提供的丰富算法库,包括查找、排序、复制等非修改序列算法和修改序列算法,以及迭代器的不同类型和功能,如输入迭代器、输出迭代器和随机访问迭代器。

Tip:为了获得更深入的学习体验,请参考相关教程或书籍,了解C++语言的更多基本结构和基本语法。

在这里插入图片描述
每篇图片分享
图片来自inscode上的开源程序
濒危动物:马来熊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/867279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 基础命令、gcc的基础用法

1、ls——>列出目录下的内容 语法&#xff1a;ls [-a -l -h] [Linux路径] &#xff08;1&#xff09;-a -l -h 是可选的选项 &#xff08;2&#xff09;Linux路径是此命令的可选参数 ①当不使用选项和参数&#xff0c;直接使用 ls 命令本体&#xff0c;表示&#xff1a;…

kubernetes集群部署:环境准备及master节点部署(二)

主机名IPv4地址IPv6地址角色安装组件操作系统k8s130-node190192.168.XX.190240a:XX::190masterkubeadm、kubelet、containerdAnolis OS 8.94.19.91-28.1.an8.x86_64k8s130-node191192.168.XX.191240a:XX::191nodekubeadm、kubelet、cri-oAnolis OS 8.94.19.91-28.1.an8.x86_64k…

Java基础-接口与实现

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 Java 接口 什么是接口&#xff1f; 声明接口 实现接口 继承接口 接口的多继承 标记接口 Java 接口 …

华为仓颉可以取代 Java 吗?

大家好&#xff0c;我是君哥。 在最近的华为开发者大会上&#xff0c;华为亮相了仓颉编程语言&#xff0c;这是华为历经 5 年&#xff0c;投入大量研发成本沉淀的一门编程语言。 1 仓颉简介 按照官方报告&#xff0c;仓颉编程语言是一款面向全场景智能的新一代编程语言&#…

好消息!Stable Diffusion 3 允许商业化,很快开源更大版本模型

7月6日凌晨&#xff0c;著名开源大模型平台Stability AI修改了社区许可协议&#xff0c;最新发布的文生图模型Stable Diffusion 3 Medium允许商业化&#xff08;以下简称“SD3-M”&#xff09;。 如果企业、个人开发者每年收入低于100万美元&#xff08;大约726万元人民币&…

《安全行业大模型技术应用态势发展报告(2024)》

人工智能技术快速迭代发展&#xff0c;大模型应用场景不断拓展&#xff0c;随着安全行业对人工智能技术的应用程度日益加深&#xff0c;大模型在网络安全领域的应用潜力和挑战逐渐显现。安全行业大模型技术的应用实践不断涌现&#xff0c;其在威胁检测、风险评估和安全运营等方…

腐蚀服务器如何设置管理员

可以设置服主与管理员 控制台中设置&#xff08;需游戏账号在线&#xff09; 服主 添加&#xff1a;在控制台中输入ownerid空格SteamID 删除&#xff1a;在控制台中输入removeowner空格SteamID 管理员 添加&#xff1a;在控制台中输入moderatorid空格SteamID 删除&#…

C++:二维数组的遍历

方式一&#xff1a; #include <vector> #include <iostream> int main() { // 初始化一个2x3的二维向量&#xff08;矩阵&#xff09; std::vector<std::vector<float>> matrix { {1.0, 2.0, 3.0}, // 第一行 {4.0, 5.0, 6.0} // 第二行 };…

【Python文件】操作终极指南:高效管理和处理文件系统的必备技能

目录 ​编辑 1. 文件的基础操作 1.1 打开/关闭文件 ​编辑 示例代码 文件对象 使用with语句打开文件 2. 读文件 2.1 使用read方法读取文件 2.2 使用readline方法读取文件 2.3 使用readlines方法读取文件 2.4 使用for循环读取文件 3. 写文件 3.1 使用write方法写文…

B组亚太赛数学建模

问题1 1.对训练数据集进行数据清洗&#xff0c;处理缺失值和异常值。 2.采用散点图作为可视化手段。 3.采用皮尔逊相关系数进行相关性分析。 4.提出预防措施。 问题2 1.采用k-means聚类算法将洪水概率分为高中低三个群组。 2.通过线性回归模型计算特征权重。 3.选择特定…

django高校教务系统-计算机毕业设计源码81661

目 录 摘要 1 绪论 1.1 研究背景 1.2目的及意义 1.3论文结构与章节安排 2 高校教务系统设计分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4…

【新能源时代!看大模型(LLMs)如何助力汽车自动驾驶!】

文末有福利&#xff01; 引言 本文主要介绍大模型(LLMs)如何助力汽车自动驾驶&#xff0c;简单来说&#xff0c;作者首先带大家了解大模型的工作模式&#xff0c;然后介绍了自动驾驶大模型的3大应用场景&#xff0c;最后指出自动驾驶大模型将会是未来的发展趋势&#xff0c;只…

制定事件响应计划的四个关键步骤,如何做到风险闭环

一个有效的安全事件响应策略的关键组成部分有哪些&#xff1f;一个有效的安全事件响应策略包括四个关键组成部分&#xff0c;它们协同工作以确保对网络安全问题的快速和有效响应。 一个有效的安全事件响应策略的关键组成部分有哪些&#xff1f; 一个有效的安全事件响应策略包括…

Linux笔记之二

Linux笔记之二 一、文件属性学习二、软链接和硬链接1.软链接2.硬链接 三、Vim编辑器四、账号管理总结 一、文件属性学习 Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux系统对不同…

HTML5使用<mark>标签:高亮显示文本

1、<mark>标签的使用 mark 标签用于表示页面中需要突出显示或高亮的一段文本&#xff0c;这段文本对于当前用户具有参考作用。它通常在引用原文以引起读者注意时使用。<mark>标签的作用相当于使用一支荧光笔在打印的纸张上标出一些文字。它与强调不同&#xff0c;…

短视频商城系统源码揭秘:架构设计与实现

在短视频平台和电商平台蓬勃发展的背景下&#xff0c;短视频商城系统应运而生&#xff0c;融合了短视频内容和电商功能&#xff0c;给用户带来了全新的购物体验。本文将揭示短视频商城系统的源码架构设计与实现&#xff0c;帮助开发者了解该系统的内部工作原理及其关键技术。 …

深度学习基础以及vgg16讲解

一 什么是卷积 上图所示&#xff0c;为图像边缘提取得一个卷积过程&#xff0c;卷积核就是计算当前像素左右两边得像素差&#xff0c;这个差值越大代表越可能是图像边缘。因此当实现其它功能时&#xff0c;只需要调整卷积核得参数即可。深度学习的训练其实就是在确定这些参数。…

学习笔记——动态路由——OSPF(邻接/邻居)

十、OSPF的邻接/邻居 1、OSPF路由器之间的关系 (1)基本介绍 在OSPF网络中&#xff0c;为了交换链路状态信息和路由信息&#xff0c;邻居设备之间首先要建立邻接关系&#xff0c;邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念。 OSPF路由器的两种关系&#x…

Type-C接口快充取电技术的实现

Type-C接口快充取电技术的实现 Type-C接口快充取电技术主要通过USB PD&#xff08;Power Delivery&#xff09;协议实现。这种技术利用了Type-C接口的物理特性和PD协议的智能性&#xff0c;实现了高效、安全、快速的充电过程。具体实现过程如下&#xff1a; 接口连接与检测&a…