(七)C++命名空间与标准模板库(STL)
由于没什么时间,发一篇水文,极其的短
C++命名空间(namespace)
1. 命名空间的作用
命名空间的主要目的是解决全局名称冲突的问题。在大型项目中,不同模块可能定义了相同名称的函数、变量或类。通过将这些实体分别放入不同的命名空间内,可以在全局范围内区分它们。
2. 命名空间成员访问方式
- 显式作用域解析运算符:
namespace MyNamespace { void function(); } int main() { MyNamespace::function(); // 显式调用命名空间内的函数
- using声明:
namespace MyNamespace { void function(); } using MyNamespace::function; // 导入特定函数到当前作用域 int main() { function(); // 现在可以直接调用
3. using指令
using namespace
语句用于导入整个命名空间的内容到当前作用域。尽管方便,但在头文件中使用可能会导致污染全局命名空间,增加编译错误和维护难度。
namespace MyNamespace {
void function();
}
// 在cpp文件中使用
using namespace MyNamespace;
int main() {
function(); // 直接调用
4. 内联命名空间
C++11引入了内联命名空间(inline namespace),它的主要特点是链接时不会创建新的作用域,而是保留原作用域,主要用于版本控制和ABI兼容性问题。
5. 匿名命名空间
匿名命名空间中的所有内容具有内部链接属性,意味着它们只在同一编译单元可见,这有助于实现文件私有数据。
C++标准模板库(STL)详解
1. STL容器
每个STL容器都有其独特的特性和适用场景:
std::vector
:动态数组,支持随机访问,插入和删除操作可能导致元素移动。std::deque
:双端队列,两端均可高效地进行插入和删除操作。std::list
:双向链表,插入和删除操作时间复杂度恒定,但不支持随机访问。std::set
和std::map
:基于红黑树实现,键唯一,自动排序。std::multiset
和std::multimap
:允许键重复。- 以及其他如栈(stack)、队列(queue)和优先级队列(priority_queue)等适配器容器。
2. STL算法
- 非修改序列算法:如
std::find
查找元素,std::count
统计元素个数,std::all_of
检查是否所有元素满足条件等。 - 修改序列算法:如
std::sort
对序列排序,std::reverse
反转序列,std::copy
复制区间等。 - 还包括如
std::transform
、std::accumulate
等用于转换和求和等操作的算法。
3. STL迭代器
迭代器是STL的核心概念之一,它提供了访问容器内元素的一致接口,且支持多种迭代器类别:
- 输入迭代器:只能读取元素并单向前进。
- 输出迭代器:只能写入元素并单向前进。
- 前向迭代器:除了输入迭代器的功能外,还可以前进后再次前进。
- 双向迭代器:可向前或向后移动,并读写元素。
- 随机访问迭代器:提供随机访问功能的所有迭代器,例如std::vector的迭代器。
4. 函数对象与lambda表达式
- 函数对象(functor)是一种重载了()`操作符的对象,可以像普通函数一样被调用,常用于STL算法中作为自定义行为。
- C++11引入了lambda表达式,它允许在代码中创建临时的、未命名的、可调用的对象,极大地简化了STL算法中自定义行为的编写。
通过深入理解和熟练运用C++命名空间和STL,开发者能够构建出更加模块化、高效且易于维护的C++程序。在实践中,结合具体业务场景选择合适的容器和算法,遵循STL的设计原则,有助于提高软件工程的质量和效率。
水到连我的格式都没有了,到时候有时间我再发一片全新的吧
原文地址:https://blog.csdn.net/Zyt527659_y/article/details/136353843
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!