🥣关于容器
STL中容器的概述
最后更新于
容器用于表示由同类型元素构成的、长度可变的元素序列。
容器是由类模板来实现的,模板的参数是容器中元素的类型。
STL中包含了很多种容器,虽然这些容器提供了一些相同的操作,但由于它们采用了不同的内部实现方法,因此,不同的容器往往适合于不同的应用场合。
用于需要快速定位(访问)任意位置上的元素以及主要在元素序列的尾部增加/删除元素的场合。
在头文件vector
中定义,用动态数组实现。
用于经常在元素序列中任意位置上插入/删除元素的场合。
在头文件list
中定义,用双向链表实现。
在C++11标准中增加了forward_list
容器,本质上是一个单向链表,定义在头文件forward_list
中。
用于主要在元素序列的两端增加/删除元素以及需要快速定位(访问)任意位置上的元素的场合。
在头文件deque
中定义,用分段的连续空间结构实现。
用于仅在元素序列的尾部增加/删除元素的场合。
在头文件stack
中定义,可基于deque
、list
或vector
来实现。
用于仅在元素序列的尾部增加、头部删除元素的场合。
在头文件queue
中定义,可基于deque
和list
来实现。
它与queue
的操作类似,不同之处在于:每次增加/删除元素之后,它将对元素位置进行调整,使得头部元素总是最大的。也就是说,每次删除操作总是把最大(优先级最高)的元素去掉。
在头文件queue
中定义,可基于deque
和vector
来实现。
用于需要根据关键字来访问元素的场合。容器中每个元素是一个pair
结构类型,该结构有两个成员:first
和second
,关键字对应first
,值对应second
,元素是根据其关键字排序的。
对于map
,不同元素的关键字不能相同;
对于multimap
,不同元素的关键字可以相同。
它们在头文件map
中定义,常常用某种二叉树来实现。
有时候我们不需要排序,所以在C++11标准中新增加了unordered_map
和unordered_multimap
容器。
它们分别是map
和multimap
的特例,每个元素只有关键字而没有值,或者说,关键字与值合一了。
在头文件set
中定义。
C++11标准中增加了unordered_set
和unordered_multiset
容器。
与vector
类似,不同之处在于其元素为字符类型,并提供了一系列与字符串相关的操作。
string
和wstring
分别是它的两个实例:
basic_string<char>
basic_string<wchar_t>
在头文件string
中定义。
容器类模板提供了一些成员函数来实现容器的基本操作,其中包括:
往容器中增加元素
从容器中删除元素
获取容器中指定位置的元素
在容器中查找元素
获取容器首/尾元素的迭代器
......
这些成员函数往往具有通用性(大部分容器类模板都包含它们)。
注意:如果容器的元素类型是一个类,则针对该类可能需要:
自定义拷贝构造函数和赋值操作符重载函数
对容器进行的一些操作中可能会创建新的元素(对象的拷贝构造)或进行元素间的赋值(对象赋值)。
重载小于操作符(<) 对容器进行的一些操作中可能要进行元素比较运算。
map
实现一个简单的电话簿至此,读者应当对于STL中的容器有了一个整体上的把控,知晓各容器的基本特征。