(基于c primer,本文主要为便于快速回忆相关知识(常用的),如侵权,请联系本人进行处理。)
总述:
->所有容器类共享公共的接口,不同容器基于性能和功能的权衡,对其进行扩展。
->所有顺序容器都提供了快速访问元素的能力。
->性能折中的方面:1.向容器中添加/删除元素的代价。2.非顺序访问容器中元素的代价。
->类型:
1.vector 。可变大小数组。&支持快速随机访问&。**尾部之外的插入/删除元素可能很慢**。
2.deque。双端队列。&支持快速随机访问&。**头/尾速度快**。
3.list。双向链表。&只支持双向顺序访问&。**任何位置插入/删除速度快**。
4.forward_list。单向链表。&只支持单向顺序访问&。**同list**。
5.array。固定大小数组。&同vector&。**不能添加/删除元素**。
6.string。与vector相似。但专门用于保存字符。&随机访问快&。**在尾部插入/删除速度
快**。
->操作:
->共有(接口同):类型别名、构造函数(个别不适用array)、赋值与swap(个别不适用array)、
大小(个别不支持 forward_list)、获取迭代器、反向容器的额外成员(全不适用forward_list)。
->非公有(接口不同,操作名一样):添加/删除元素(全不适用于array) 。
初始化
->定义和初始化:
C c; C c1(c2); C c1=c2; C c{a,b,c...}//列表初始化 ;C c={a,b,c...}; C c(b,e)//指定范围,array不适用;
C seq(n)//explicit,string不适用; C seq(n,a)//array不适用;C seq(n,t);
【其中大部分初始化,若是array,有特殊要求】
赋值和swap(赋值相关操作会使指向左边容器内部的迭代器、引用、指针失效。
swap操作不会失效[除了array和string]。)
->可用于所有容器:
->c1=c2;c={a,b,c...}//不适用array;swap(c1,c2)//通常比拷贝快;c1.swap(c2);
->assign操作不适用关联容器和array。(一个对象被允许从一个不同但相容的类型赋值)
seq.assign(b,e) //将seq中元素换为迭代器b,e所表示的范围中的元素。b,e不能指向seq中
的元素。
seq.assign(il)//将seq中元素替换为初始化列表il中的元素。
seq.assign(n,t)//将seq中元素更换为n个值为t的元素。
操作:
->添加(非array:内置函数) :insert一般返回值,指向新插入的元素
push_back(t);emplace_back(args);尾添加 push_front(t);emplace_front(args);头添加
insert(p,t);emplace(p,args);p指向的元素的之前添加 insert(p,n,t);在p指向的元素之前添加n个t
insert(p,b,e);在p指向的元素之前的位置,添加p到e范围的元素进去,p,e迭代器指向的不能是p
所在的容器中。
->forward有自己的insert和emplace,且不支持push_back和emplace_back。
vector和string不支持push_front和emplace_front。
->删除 :erase一般返回值,指向最后一个被删除元素之后的元素
pop_back();pop_front();erase(p);erase(b,e);clear();
->forward_list有特殊版本erase。不支持pop_back。
vector和string不支持pop_front()。
->改变容器大小(不适用array)
resize(n);resize(n,t)//调整大小为n,新添加的元素初始化为t;