1.
vector, deque, list, forward_list, array, string的区别
vector 可变大小数组,支持快速随机访问,在尾部之外的位置插入或删除元素可能很慢
deque 双端队列,支持快速随机访问,在中间位置添加或删除元素的代价可能很高,但是在两端添加或删除元素很快
list 双向链表,只支持双向顺序访问,在任何位置插入或删除元素都很快
forward_list 单向链表,只支持单向顺序访问
array 固定大小数组,支持快速随机访问,不能添加或删除元素
list和forward_list的额外内存开销大
forward_list没有size操作
2.
容器间可以进行拷贝,但他们必须是相同的容器类型,且保存的是相同的元素类型
当传递迭代器参数来拷贝一个范围时,就不要求容器类型是相同的了。而且,新容器和原容器中的元素类型也可以不同,只要能将要拷贝的元素转换为要初始化的容器的元素类型即可
vector<const char*> articles = {"a", "an", "the"};
forward_list<string> words(articles.begin(),articles.end());
在新标准中,我们可以对一个容器进行列表初始化。
如果元素类型是内置类型或是具有默认构造函数的类类型,可以只为构造函数提供一个容器大小的参数。如果元素类型没有默认构造函数,除了大小参数,还必须制定一个显示的元素初始值
当定义一个array时,除了指定元素类型,还要指定容器大小,大小是array类型的一部分
array<int, 42> arr;
不同于内置数组,array可以进行拷贝和赋值操作
赋值相关操作会导致指向左边容器内部的迭代器、引用和指针失效。而swap操作将容器内容交换不会导致指向容器的迭代器、引用和指针失效(array和strign除外)
除array外,swap不对任何元素进行拷贝、删除或插入操作,因此可以保证在常数时间内完成,而swap两个array会真正交换他们的元素
3.
vector和string不支持push_front和emplace_front
forward_list不支持push_back和emplace_back
insert将元素插入到迭代器所指定的位置之前,接受一对迭代器或一个初始化列表的insert版本将给定范围中的元素插入到指定位置之前
接受元素个数或范围的insert版本返回指向第一个新加入元素的迭代器
当我们调用emplace成员函数时,则是将参数传递给元素类型的构造函数,emplace成员使用这些参数在容器管理的内存空间中直接构造元素
c.emplace_back("987-0590353403", 25, 15.99);
c.push_back(Sales_data("987-0590353403", 25, 15.99);
c.erase(p);
删除迭代器p所制定的蒜素,返回一个指向被删元素之后元素的迭代器
c.erase(b,e);
删除迭代器b和e所制定范围内的元素,返回一个指向最后一个被删除元素之后元素的迭代器
删除deque中除首尾位置之外的任何元素都会使所有迭代器、引用和指针失效。指向vector或string中删除点之后位置的迭代器、引用和指针都会失效
4.
reserve并不改变容器中元素的数量,它仅影响vector预先分配多大的内存空间。当需求大小小于当前容量时,容器不会退回内存空间。因此,在调用reserve之后,capacity将会大于或等于传递给reserve的参数
容器的size是指它已经保存的元素的数目,而capacity则是在不分配新的内存空间的前提下它最多可以保存所少元素
5.
string s(cp,n);
s是cp指向的数组中前n个字符的拷贝
string s(s2,pos2);
s是string s2从下标pos2开始的字符的拷贝
find 返回第一个匹配位置的下标,可选参数可指出从哪个位置开始搜索
s.find_first_of(args) 在s中查找args中任何一个字符第一次出现的位置
s.find_first_not_of(args) 在s中查找第一个不在args中的字符的位置
6.
顺序容器适配器:stack, queue, priority_queue
默认情况下,stack和queue是基于deque实现的,priority_queue是在vector之上实现的
每个容器适配器都基于底层容器类型的操作定义了自己的特殊操作。我们只可以使用适配器操作,而不能使用底层容器类型的操作