顺序性容器用来维护一组排列有序、类型相同的元素。
一、vector:
vector内的每个元素都被储存在距离其实点的固定偏移位置上。
#include <vector>
1.1 创建新容器
vector<int> ivec01;
vector<int> ivec02(10);
// 产生特定大小的容器,并为每个元素指定初值。
vector<int> ivec03(10, -1);
// 通过一对iterator产生容器。
int ia[8] = {1, 1, 2, 3, 5, 8, 13, 21};
vector<int> ivec04(ia, ia + 8);
二、list:
list以双向链接(double-linked)而非连续内存来存储内容,因此可以执行前进或后退操作。
(list中的每个元素都包含三个字段:value、back指针(指向前一元素)、front指针(指向下一元素))
#include <list>
2.1 创建新容器
list<string> slist01;
list<string> slist02(16);
// 产生特定大小的容器,并为每个元素指定初值。
list<string> slist03(16, "unassigned");
// 根据某个容器产生出新容器。复制原容器内的元素,作为新容器的初值。
list<string> slist04(slist03);
2.3 通用插入函数insert
// iterator insert( iterator position, elemType value )
// 将value插入position之前,并会返回一个iterator,指向被插入的元素。
list<int> ilist = {1, 2, 3, 4, 5, 6, 7, 8};
list<int>::iterator it = ilist.begin();
while (it != ilist.end())
{
if (*it >= 5)
{
ilist.insert(it, 5);
break;
}
++it; // list类型只能单步加
}
if (it == ilist.end())
ilist.push_back(ival);
for (it = ilist.begin(); it != ilist.end(); ++it)
cout << *it << " ";
cout << endl;
// void insert( iterator position, int count, elemType value )
// 可在position之前插入count个元素,这些元素的值都和value相同。
ilist.insert(ilist.begin(), 4, -1);
for (it = ilist.begin(); it != ilist.end(); ++it)
cout << *it << " ";
cout << endl;
// void insert( iterator1 position, iterator2 first, iterator2 end )
// 可在position之前插入[first, last)所标示的各个元素
int ia1[7] = {1, 1, 2, 3, 5, 55, 89};
int ia2[4] = {8, 13, 21, 34};
list<int> elems(ia1, ia1+7);
list<int>::iterator iter = elems.begin();
for(; iter != elems.end() && *iter != 55; ++iter);
elems.insert(iter, ia2, ia2+4);
for (iter = elems.begin(); iter != elems.end(); ++iter)
cout << *iter << " ";
cout << endl;
2.4 通用删除函数erase
// iterator erase( iterator position )
// 删除position所指的元素
for (iter = elems.begin(); iter != elems.end() && *iter != 55; ++iter);
elems.erase(iter);
for (iter = elems.begin(); iter != elems.end(); ++iter)
cout << *iter << " ";
cout << endl;
// iterator erase( iterator first, iterator last )
// 删除[first,last)范围内的元素
list<int>::iterator first = ilist.begin(), last = ilist.end();
for (first = elems.begin(); first != elems.end() && *first != 2; ++first);
for (last = elems.begin(); last != elems.end() && *last != 8; ++last);
ilist.erase(first, last);
for (iter = elems.begin(); iter != elems.end(); ++iter)
cout << *iter << " ";
cout << endl;
三、deque:
#include <deque>
deque的行为和vector颇为类似,都以连续内存存储元素。但deque对于前后端元素的插入和删除操作效率更高,是queue的底部存储元素。
3.2 插入、读取、删除
deque<int> a_line;
int ival = -1;
// 将ival插入a_line前端
a_line.push_front(ival);
// 读取a_line最前端元素的值
int front_value = a_line.front();
// 删去a_line最前端元素
a_line.pop_front();
// 将ival插入a_line后端
a_line.push_back(ival);
// 读取a_line最后端元素的值
int back_value = a_line.back();
// 删去a_line最前端元素
a_line.pop_back();