自学内容网 自学内容网

(七)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::setstd::map:基于红黑树实现,键唯一,自动排序。
  • std::multisetstd::multimap:允许键重复。
  • 以及其他如栈(stack)、队列(queue)和优先级队列(priority_queue)等适配器容器。

2. STL算法

  • 非修改序列算法:如std::find查找元素,std::count统计元素个数,std::all_of检查是否所有元素满足条件等。
  • 修改序列算法:如std::sort对序列排序,std::reverse反转序列,std::copy复制区间等。
  • 还包括如std::transformstd::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)!