容器
是特定类型对象的集合顺序容器
中元素的顺序与其加入容器的位置对应关联容器
中元素的顺序由其关联的关键字决定,关联容器分为有序关联容器
和无序关联容器
容器适配器
,为容器操作定义了不同的接口array
大小固定,其他容器都允许扩张和收缩,且高效线性表
:string
和vector
将元素存储在连续空间中,故通过下标的随机访问很快,在中间和头部插入/删除很慢,在尾部添加元素很快,添加元素可能造成空间的重新分配和元素拷贝。链表
:list
(双向链表)和forward_list
(单向链表)的设计目的是让任何位置的插入/删除都快速高效且不需重新分配内存。但不支持随机访问,为访问一个元素需要遍历整个链表。由于要存储指针,故内存开销大。队列
:deque
(双端队列)支持快速随机访问,且在中间插入/删除元素很慢,但两端插入/删除很快。选择容器
的最佳实践:
++
/--
而不是下标访问所有容器
都提供顺序容器
,某些操作仅针对关联容器
,某些操作仅针对无序容器
特定容器
头文件
中,文件名与容器名相同。模板类
vector<vector<string> >
--
)string
、vector
、deque
、array
支持的迭代器算术运算。它们不适用于其他容器迭代器类型
:iterator
迭代器类型,const_iterator
常量迭代器类型整型
:size_type
无符号,difference_type
有符号类型别名
:value_type
元素类型,reference
元素的左值(引用)类型,const_reference
元素的常量引用类型反向迭代器
,它可反向遍历容器。与正向迭代器相比,其各种操作含义被颠倒。例如对反向迭代器做++
得到上一个元素::
指明作用域,即模板类的类名(含模板参数)begin
和end
成员函数得到指向容器首元素和尾后元素的迭代器,即形成包含容器中所有元素的迭代器范围rbegin
返回反向迭代器,cbegin
返回常量迭代器,crbegin
返回常量反向迭代器auto it=a.cbegin();
。
|
|
vector<string> articles={"a","an","the"};
。除array外,初始化列表还隐式指定了容器的大小。list<string> svec(10,"hi!");
。如果不给初值,则进行值初始化(内置类型初始化为0,类类型调用默认构造函数)。这种对关联容器不适用。
|
|
赋值
相关操作可用于所有容器。赋值运算符将左边容器中的所有元素替换为右边容器中元素的拷贝
=
赋值,不可用assign
,也不可用花括号列表赋值。=
要求两侧容器类型和元素类型都相等,但assign
不要求容器类型相同,只需要元素类型可转换即可assign
用参数指定的元素替换该容器的所有元素。其参数可为:
|
|
swap
交换两个相同类型容器的内容O(1)
时间O(n)
时间it
指向svec1[3]
,在进行swap(svec1,svec2);
后,it
指向svec2[3]
,对it
解引用得到的结果前后一致。swap(a,b)
而不是a.swap(b)
size
返回容器中元素的数目empty
当size为0时返回true,否则falsemax_size
返回一个大于等于该类型容器所能容纳的最大元素数量的值forward_list
只支持empty
和max_size
,不支持size
==
和!=
,除无序关联容器外都支持关系运算符<
、<=
、>
、>=
字典顺序
的比较==
实现,其他关系运算符是用元素的<
实现顺序容器
中元素的顺序与其加入容器的位置对应,关联容器
中元素的顺序由其关联的关键字决定容器元素是拷贝
:用一个元素初始化容器,或把元素插入到容器中,都是拷贝。与原始对象互不影响。push_back
:在尾部插入元素。除array和forward_list外,每个顺序容器都支持push_backpush_front
:在头部插入元素。list、forward_list、deque容器支持push_frontinsert
:在任意位置插入0个/多个元素。vector、string、deque、list都支持insert。forward_list提供了特殊的insert迭代器之前
插入。在之前是为了考虑左闭右开区间。值
个数和值
,插入多个该值迭代器范围
,将此范围内的迭代器插入。此范围不可来自被插入容器initializer_list/花括号列表
第一个新加入元素
的迭代器。如范围为空,则不插入,返回insert的第一个参数。该设计是为了重复插入
|
|
emplace_front
、emplace_back
、emplace
,分别对应push_front
、push_back
、insert
。区别是emplace
是在原地构造元素,而push/insert是拷贝元素emplace
时,它将参数传递给元素类型的构造函数,使用它们在容器的内存空间中直接构造元素。故emplace的参数需对应到元素的构造函数参数
front
成员函数,除forward_list之外的顺序容器都有back
成员函数。前者返回首元素的引用,后者返回尾元素的引用front
、back
、[]
、at
)都返回引用
。若要用auto,记得将变量声明为引用,否则存在拷贝且不能修改容器。[]
。[]
不检查下标是否在合法范围,但at
成员函数在下标越界时抛出out_of_range
异常pop_front
和pop_back
成员函数分别删除首元素和尾元素erase
可从指定的任意位置删除元素,它有两个版本:
clear
,也可用begin/end调用erase
前驱
。insert
、emplace
、erase
,但定义了insert_after
、emplace_after
、erase_after
来提供类似操作before_begin
迭代器,它指向首元素之前,称为首前迭代器
|
|
resize
改变大小的操作,不支持array 值初始化
的新元素添加到容器尾部。可以指定值初始化的初始值vector/string
:若空间被重新分配,则所有指针/引用/迭代器失效。若空间未重新分配,则插入位置的之后的指针/引用/迭代器都失效deque
:插入首尾之外的任何位置都使所有指针/引用/迭代器失效。在首尾插入时,迭代器失效,指向元素的指针/引用不失效list/forward_list
:所有指针/引用/迭代器仍有效vector/string
:删除位置的之后的指针/引用/迭代器都失效。特别是,删除任何元素时,尾后迭代器一定失效deque
:删除首尾之外的任何位置都使所有指针/引用/迭代器失效。删除首元素无影响,删除尾元素使尾后迭代器失效list/forward_list
:除被删除元素之外的所有指针/引用/迭代器仍有效
|
|
连续存储
分配空间
、拷贝元素
、释放空间
capacity
操作告诉我们容器在不扩张内存时最多还能容纳多少元素reserve
操作允许通知容器它至少需要容纳多少元素size
,只影响预分配的内存resize
方法只改变元素数量,不影响capacityshrink_to_fit
是C++11的方法,它可要求vector/string/deque退回多余的空间,但具体实现可忽略此要求。即,不保证能退回。内存扩张策略
一般是:在每次需要分配新空间时,将当前容量翻倍。但具体实现可使用不同策略push_back
添加元素有高效率。即,在初始为空的vector上调用n次push_back,花费时间不应超过n的常数倍构造函数
string
或const char *
参数作为源,还接受(可选的)指定拷贝多少个字符的参数。当源为string时,还可给定下标来指定从哪里开始拷贝const char *
构造string时,字符数组必须以空字符\0
结尾,用于停止拷贝。但若给定拷贝大小的计数值,则只需不越界,不需空字符结尾。string
构造string时,可提供开始位置和计数值。开始位置必须小于等于源string大小,否则out_of_range异常。不管要求拷贝多少,最多拷到源string结尾。insert/erase
可接受下标,用于指定insert到指定值之前的位置,或是开始删除的位置。inset/assign
可接受C风格字符串
|
|
|
|
指定要被替换的部分
:
指定要添加的字符
:见表9.13string::size_type
类型值,表示匹配位置的下标。string::npos
的static成员,它是string::size_type
类型且初始化为-1
,即string最大的可能大小string::size_type
是无符号类型,不可与int等有符号混用find
查找参数字符串第一次出现的位置,rfind
查找参数字符串最后一次出现的位置find_first_of
查找参数中任何一个字符第一次出现的位置,find_last_of
查找参数中任何一个字符最后一次出现的位置find_first_not_of
查找第一个不在参数中的字符,find_last_not_of
查找最后一个不在参数中的字符循环查找
所有匹配的位置
|
|
to_string
将数值类型转为对应的string表示,其他各函数将string表示转为相应的数值类型0x
或0X
表示的十六进制数(此时string中可包含字母)。对于浮点类型,可以小数点.
开头,并可包含e
或E
指定指数部分。invalid_argument
异常out_of_range
异常适配器
是一种机制,能使某种事物的行为看起来像另一种事物。一个容器适配器
接受一种已有的容器类型,使其看起来像另一种不同类型顺序容器适配器
:stack、queue、priority_queuestack
和queue
基于deque实现,priority_queue
基于vector实现。也可在创建时在模板参数里指定一个顺序容器来重载默认容器类型stack
要求back
、push_back
、pop_back
操作,故可构建于除array/forward_list外的所有容器queue
要求back
、push_back
、front
、push_front
,故可构建于list/dequepriority_queue
要求front
、push_back
、pop_back
、随机访问
,故可构建于vector/dequestack头文件
中,其特有操作如表9.18 queue头文件
中,其特有操作如表9.19 <
运算符来确定优先级原文:https://www.cnblogs.com/updown/p/14280934.html