一个容器的就是一些特定类型对象的集合,顺序容器为程序员提供了控制元素存储和访问的能力。
9.1顺序容器概述
- vector 可变大小数组。支持快速随机访问,在尾部之外的位置删除和添加元素很慢
- deque 双端队列。支持随机快速随机访问。在头部和尾部插入/删除速度很快
- list 双向链表,支持双向顺序访问,在链表的任何位置插入/删除操作都很快
- forward_list 单向链表,支持单向顺序访问,在链表的任何位置插入/删除操作都很快
- array 固定大小数组,支持随机访问,不能添加删除元素
- string 类似于vector
9.2容器库概览

9.2.1迭代器
一个迭代器范围由一堆迭代器表示,两个迭代器分别为begin和end,begin指向容器的第一个元素,end并不是指向最后一个元素,而是指向后一个元素的下一个位置。这也符合左闭合区间的编程规定。主要有两点好处。
- 如果begin等于end,那么范围为空
- 如果begin不等于end,那么范围内至少有一个值,并且begin指向该范围中的第一个元素
- 可以对begin进行若干次递增,使得begin等于end
迭代器两个常用的函数,advance(迭代器向前移动n),distance(计算两个迭代器的距离)
int main(int argc, const char * argv[]) {
list<int>mylist{1,2,3,4,5};
list<int>::iterator it=mylist.begin(),it1=mylist.end(),test;
//将it向前移动
advance(it, 1);
//计算两个迭代器的距离,begin这个时候指向2,end指向5
int n=(int)distance(it, it1);
//结果5,4
cout<<mylist.size()<<" "<<n<<endl;
return 0;
}
9.2.2容器定义和初始化

下面来举例子:
int main(int argc, const char * argv[]) {
vector<int>n;
vector<int>n1(n);
vector<int>n2=n;
vector<int>n3{1,2,3};
vector<int>n4={1,2,3};
vector<int>n5(n3.begin(),n3.end());//拷贝[begin,end)的范围的值,左闭右开
vector<int>n6(10);
vector<int>n7(10,1);
return 0;
}
array分为标准库array<int,10>d1和内置数据数组int ap[10],这两种的共同点就是声明的时候需要指定数据类型和大小,最大的不同就是内置数组不支持赋值和拷贝操作。
9.2.3交换和赋值

9.3顺序容器操作
9.3.1添加元素

9.3.2访问元素
这些基本都用过~

9.4vector对象是如何增长的

9.5额外的string操作
9.5.1 string的构造
比较懒惰,直接复制粘贴了

s.substr(pos,n)//返回一个string,包含s中从pos开始的n个字符的拷贝,pos默认值为0,n默认值为s.size()-pos。
9.5.2 string的搜索操作


9.5.3string的转换操作
