C++标准库——第一周课程笔记
课程目标:
level 0:使用C++标准库
level 1:认识C++标准库
level 2:良好使用C++标准库
level 3:扩充C++标准库
本课程希望我们能够学会使用C++标准库的相关内容,并在了解标准库源代码的基础上,正确的使用其中的内容,提高程序的运行效率。
关于C++标准库的一些参考网站:
CPlusPlus.com
CppReference.com
gcc.gnu.org
第一周先介绍了C++标准库的组织形式,即六大部件以及其相关关系。然后重点介绍了容器的特性以及其使用方式。
一、六大部件介绍
• 容器 Container
• 分配器 Allocator
• 算法 Algorihm
• 迭代器 Iterator
• 配适器 Adopter
• 仿函数 Function
六大部件的关系如上图所示。容器负责实现数据结构,算法负责执行基本的算法函数,这两个是标准库的核心组件。迭代器是连接上述两个部件的桥梁,迭代器是指向容器内数据的智能指针,算法通过操作迭代器实现对容器内数据的便利和操作。分配器是一个底层部件,负责进行容器空间的分配以及程序内存空间的管理操作。仿函数和配适器在之前的课程中有所介绍,二者主要在标准库使用的便捷性和安全性中起作用。
以下为六大部件使用方法的基本示例
二、容器介绍
1.容器的迭代器
容器的迭代器可以看作是容器内元素的指针,在C++中,所有容器操作和算法都遵循前闭后开的原则进行,即首迭代器指向的是第一个元素,尾迭代器指向的是最后一个元素的下一个元素。C++中一共有5中迭代器,分别为只读迭代器、只写迭代器、单向迭代器、双向迭代器、随机迭代器。其中较为常见的是后三种迭代器,且这些迭代器能力依次增强。部分算法对迭代器的类型有一定的要求。
2.容器
上图显示了各个容器的逻辑结构,其特点如下:
• Array:前后都无法扩充,大小固定的容器,可使用随机迭代器
• Vector:可以在后端扩充的容器,可使用随机迭代器
• Deque:前后都可以扩充的容器,可使用随机迭代器
• List:双向循环链表,插入、删除元素效率较高,可使用双向迭代器
• Forward-List:单向循环链表,插入、删除元素效率较高,可使用单向迭代器
• Set/Multiset:底层采用红黑树结构的集合类,元素查找效率非常高。
• Map/Multimap:底层采用红黑树结构的键值对类,根据键查找值的效率非常高。
• Unordered Set/Multiset:底层采用哈希表结构的集合类,元素查找效率非常高。
• Unordered Map/Multimap:底层采用哈希表结构的键值对类,根据键查找值的效率非常高。
3.分配器
每个容器都有两个模板参数,一个是容器数据类型参数,一个是容器内存分配器参数。第二个参数是有默认值的参数,因此,一般情况下不需要填写,当你希望改变内存分配方式时,可以填写该参数。