C++中的顺序容器
容器定义和初始化
与顺序容器大小相关的构造函数
注意:只有顺序容器的构造函数才接受大小参数,关联容器并不支持。
标准库array具有固定大小
因为大小是array类型的一部分,array不支持普通的容器构造函数。
六种初始化vector对象的方法
vector<int> ilist1;
vector<int> ilist2(ilist); // vector<int> ilist2_1 = ilist;
vector<int> ilist = {1,2,3.0,4,5,6,7}; // 包含3.0的类型转换
vector<int> ilist3(ilist.begin()+2,ilist.end()-1);
vector<int> ilist4(7);
vector<int> ilist5(7,3); //7个值为3的int
赋值和swap
使用assign(仅顺序容器)
顺序容器定义了一个名为assign的成员,允许我们从一个不同但相容的类型赋值,或者从容易的一个子序列赋值,assign操作用参数所指定的元素(的拷贝)替换左边容器的所有元素。
使用array
除array之外,swap不对任何元素进行考诶、删除或者插入操作,因此可以保证在常数时间内完成。交换来听歌容器内容的操作保证会很快,
元素本身并没有交换,swap只是交换了两个容器内部数据结构。而交换两个array所需时间与array中元素的数目成正比。
另:统一使用非成员版本的swap是一个好习惯,因为其在泛型编程中时很重要的。
容器大小操作
顺序容器操作
使用push_back
除array和forward_list之外,顺序容器支持push_back将元素压入容器尾部。
关键概念:容器元素是拷贝。
使用push_front
list、forward_list和deque容器还支持名为push_front的操作,将元素插入到容器的头部。
在容器特定位置添加元素
slist.insert(iter,"hello!"); //hello插入到了iter指向的元素之前。
插入范围内元素
使用isert的返回值
使用emplace操作
注意:
访问元素
删除元素
特殊的forward_list操作
改变容器大小
容器操作可能使迭代器失效
防止迭代器失效的操作:
为了防止添加和删除vector、string、或deque元素循环程序必须考虑迭代器、引用和指针可能失效的问题。程序必须保证每个循环步骤中都更新迭代器、引用或指针。
不要保存end返回的迭代器。 因为end返回的迭代器总是会失效。
vector对象是如何增长的
【采用多分配一点空间作为备用】
管理容量的成员函数
capcity和size
容器的size是指它已经保存的元素的数目,而capacity则是在不分配新的内存空间的前提下它最多可以保存多少元素。
也就是说,capacity是包含备用空间的大小,size只是当前保存的元素的数量。
为什么list或array没有capacity成员函数
因为list新节点是从空间中分配新的内存,而删除节点是直接将节点占用的内存释放,所以不存在保留空间这个说法,至于array,数组内存是一次性分配,大小不变,不会变化。
额外的string操作
substr操作
改变string的其它方法
改变string的多种重载函数
string搜索操作
指定在哪里开始搜索
逆向搜索
compare函数
数值转换
容器适配器
栈适配器
队列适配器