顺序容器包括以下几类:
1、vector
可变大小数组,可以理解为广义的动态数组,如:typename *a = new typename [N] 。因为,数组是一组连续的存储单元,所以可以通过数组首地址+index来访问其中元素,也即使支持快速随机访问。在尾部之外的位置插入或者删除元素可能会很慢。 这是因为,插入或者删除都需要移动插入/删除位置之后的元素。
· vector是不支持push_front(),pop_front()操作的,原因可参考为什么vector没有push_front()和pop_front()操作?,但是同样可以实现pop_front(),如下:
vector<int> a;
a.push_back(1);
a.push_back(2);
a.erase(a.begin()); //返回下个一个元素的迭代器
2、string
跟vector类似,但是是 专门用来保存字符的数组。可快速随机访问。
3、array
跟内置数组一样, 有固定大小,声明的时候需要说明大小、类型。如:array <typename,type_size> a;既然跟内置数组一样,那自然不支持删除或者插入。但可以快速随机访问。
4、deque
double-end queue(双端队列),就是支持队首和队尾删除插入的队列。支持快速随机访问。
5、list
双向链表,跟单向链表的区别在于,双向链表可以双向顺序访问。
6、forward_list
单向链表,只支持单向顺序访问。
顺序容器的共性:
1)都是线性的、顺序的,这中顺序跟元素的值没关系,跟元素加入容器时的位置相对应。
2)都能支持大部分操作
顺序容器操作归类:
1、类型别名
iterator 迭代器
size_tpye 无符号整数类型
differecne_type 有符号整形,保存两个迭代器直间的距离
2、构造函数
C c; 默认构造函数,构造空容器
C c1(c2); 调用拷贝构造函数,构造C1
C c(beg,end); 将迭代器指定的范围[beg,end)的元素拷贝到c中,array不支持
C c(num,data); //用Num个data初始化
C c{a,b,c...} ; 用初始化列表(C++11)
3、赋值
c1 = c2;
c1 = {a,b,c..};
swap(a,b) 等价于 a.swap(b);
4、更改容器内容
insert(); //插入
push_back(); //尾部插入
pop_back(); //尾部删除
erase(); //删除指定位置的元素
emplace(); //替换,是erase()和Insert()的结合
clear(); //清空
5、获取迭代器
begin(); //第一个元素的迭代器
end(); //最后一个元素的下一个位置的迭代器
rbegin(); redn(); //反向迭代器
6、获得元素
at(); //只有使用连续内存的才可以用at,如vector,string,deque,array
*iterator; //对有效的迭代器解引用
back(); //尾部元素
front(); //第一个元素
7、容量
resever(); //预先分配内存,不会减小已有的容量
capacity(); //获得当前容量
size(); //当前元素个数
shrink_to_fit(); //根据size()调整容量