1、顺序容器
vector 支持快速随机访问 ,代价:中间插入元素开销大 。
list 支持快速插入和删除 ,代价:随机访问开销大 。
deque 双端队列,从两端插入和删除数据都比较快。
2、容器构造函数
C<T> c; 创建一个名为c 的空容器。c 是容器类型名,如vector , T 是元素类型,如int 或string 。适用于所有容器
C c(c2}; 创建容器c2 的副本c; c 和c2 必须具有相同的容器类型,并存放相同类型的元素。适用于所有容器
C c (b , e) ; 创建c ,其元素是迭代器b 和e 标示的范围内元素的副本。适用于所有容器
C c (n , t) ; 用n 个值为t 的元素创建容器C ,其中值t 必须是容器类型c 的元素类型的值,或者是可转换为该类型的值,只适 用于顺序容器
C c (n) ; 创建有n 个值初始化C3.3.1 节) Cvalue-initialized) 元素的容器c,只适用于顺序容器
3、访问容器内元素的操作。
c[n] 返回下标为n的元素的引用, 如果n<O 或n>=c .s ize() ,则该操作未定义 。
只适用于vector 和deque 容器。
c.at(n) 返回下标为n 的元素的引用。如果下标越界,则该操作未定义。
只适用于vector 和deque 容器。
list是链表存储,并不支持随机访问,所以无法通过下标的方式索引。
测试代码:
//vector容器常规使用
void test_Vector() {
// *** vector 容器,连续内存区域,支持快速 随机访问读,插入删除效率低 ***
vector 初始化
vector<int> v0; //默认构造函数, v0为空
vector<int> v1(10, 5); //指定值初始化,十个值为5的容器
vector<int> v2(v1); //拷贝构造,v2是v1的副本
vector<int> v3(10); //十个值为0的容器,标准库默认初始化0
int a[] = { 1,2,3,4,5 };
vector<int> v_a(a, a+5);//数组元素初始化
常规操作
bool isEmpty = v1.empty();//判断是否为空
vector<int>::size_type size1 = v1.size();//返回容器大小, size=10
v1.resize(100);//重新定义大小
size1 = v1.size();//size=100
vector<int>::size_type cap_size = v1.capacity();//返回容器容纳个数,大于等于size(); cap_size=100
插入元素
v0.push_back(11);//在容器v0末尾添加一个值为11 的元素
v0.push_back(22);//在容器v0末尾添加一个值为22 的元素
v0.push_back(33);//在容器v0末尾添加一个值为33 的元素
v0.insert(v0.begin()+1, 99);//在迭代器指向元素的前面插入值,[11 99 22 33]
获取元素
int ele = v0[0];//支持随机访问元素, =11
int ele_ = v0.at(1);//支持随机访问元素,=99
int ele_first = v0.front();//容器的第一个元素, =11
int ele_end = v0.back();容器的最后一个元素, =33
删除
vector<int>::iterator iter = v0.begin();
v0.erase(iter);//删除第一个元素, [ 99 22 33]
size1 = v0.size();//size=3
cap_size = v0.capacity();//cap_size=4,
v0.clear();//清空元素, size=0
cap_size = v0.capacity();//** cap_size=4 ,元素删除或清空不会影响capacity**
//迭代器遍历
for (vector<int>::iterator iter=v_a.begin(); iter != v_a.end(); ++iter)
{
cout << "v_a element: " << *iter << endl;
*iter += 10;//更改每个元素的值
cout << "add result:" << *iter<<endl;
}
}