容器是特定类型对象的集合顺序容器中元素的顺序与其加入容器的位置对应关联容器中元素的顺序由其关联的关键字决定,关联容器分为有序关联容器和无序关联容器容器适配器,为容器操作定义了不同的接口
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.13
string::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_queue
stack和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