一、容器概念:容器是储存其他对象的对象。被储存的对象必须是同一类型。
基本特征:以下用X表示容器类型(后面会讲到),T表示储存的对象类型(如int);a和b表示为类型X的值;u表示为一个X容器的标识符(如果X表示vector
表 达 式
返 回 类 型
说 明
复 杂 度
X::iterator
指向T的迭代器类型
满足正向迭代器要求的任何迭代器
编译时间
X u
创建一个名为u的空容器
固定
X ()
创建一个匿名空容器
固定
X u(a)
同X u(a);
线性
a.begin()
迭代器
返回指向容器第一个元素的迭代器
固定
a.end()
迭代器
返回指向超尾值的迭代器
固定
a.size()
无符号整型
返回元素个数
固定
a.swap()
void
交换a和b内容
固定
a == b
可转换为bool
如果a和b长度相当且每个元素都相等,则为真
线性
a != b
可转换为bool
返回!(a == b)
线性
二、序列容器常用容器:vector、deque、list、queue、stack
概念:序列是对基本容器的一种改进,在保持其基础功能上增加一些我们需要的更为方便的功能。
要求:序列的元素必须是严格的线性顺序排序。因此序列中的元素具有确定的顺序,可以执行将值插入到特定位置、删除特定区间等操作。
序列容器基本特征:以下用t表示类型为T(储存在容器中的值的类型)的值,n表示整数,p、q、i和j表示迭代器。
表 达 式
返 回 类 型
说 明
X a(n,t)
声明一个名为a的由n个t值组成的序列
X(n,t)
创建一个由n个t值组成的匿名序列
X a(i,j)
声明一个名为a的序列,并将其初始化为区间[i,j)的内容
X(i,j)
创建一个匿名序列,并将其初始化为区间[i,j)的内容
a.insert(p,t)
迭代器
将t插入到p的前面
a.insert(p,n,t)
void
将n个t插入到p的前面
a.insert(p,i,j)
void
将区间[i,j)的元素插入到p前面
a.erase(p)
迭代器
删除p所指向的元素
a.erase(p,q)
迭代器
删除区间[p,q)中的元素
a.clear()
void
清空容器
不同容器特有的特征:
表 达 式
返 回 类 型
含 义
支 持 的 容 器
a.front()
vector、list、deque
a.back()
vector、list、deque
a.push_front(t)
list、deque
a.push_back(t)
vector、list、deque
a.pop_front(t)
list、deque
a.pop_back(t)
vector、list、deque
a[n]
vector、deque
a.at(t)
vector、deque
*a[n]和a.at(n)都返回一个指向容器中第n个元素的引用。区别在于:如果n落在容器有效区间之外,a.at(n)将执行边界检查,并引发out_of_range异常。
*之所以vector没有push_front(),是因为vector执行此表达式复杂度为线性时间,而deque为固定时间。(这与它们的特性有关,下面讲到)
(一)vector
vector是最简单也是最重要的一个容器。其头文件为
(二)deque
头文件
list表示双向链表。头文件list为可反转容器。list不支持数组表示法和随机访问。与矢量迭代器不同,从容器中插入或删除元素之后,链表迭代器指向的元素不变。这与链表的特性有关,删除链表中的元素并不改变其它元素位置,只是修改链接信息。(代码证明)不同于vector,list不强调随机访问与快速访问,list强调的是元素的快速插入与删除再次提醒:序列容器都是线性排序,因此list首尾不会相连。list成员函数:函 数
说 明
void merge(list
将链表x与调用链表合并,俩个链表必须已排序。合并后的经过排序的链表保存在调用链表中,x为空。线性时间。
void remove(const T & val)
从链表中删除val的所有实例。线性时间。
void sort()
使用<运算符对链表进行排序,复杂度NlogN
void splice(iterator pos,list
将链表x的类容插入到pos前面,x将为空。固定时间。
void unique()
将连续相同的元素压缩为单个元素。线性时间。
放入代码中:
#include
#include
#include
#include
using namespace std;
void outint(int n){cout << n << " ";}
void Show(list
if(flag) cout<<"dice = ";
else cout<< " two = ";
for_each(dice.begin(),dice.end(),outint);//输出容器的元素。
cout << endl;
}//此函数用来输出容器元素
int main()
{
list
Show(dice,1);
int a[] = {1,5,4,3};
dice.insert(dice.begin(),a,a+4);//insert函数用法
Show(dice,1);
list
Show(two,0);
dice.splice(dice.begin(),two);//splice函数用法
Show(dice,1);
Show(two,0); //two清空
two = dice;
dice.unique();//unique压缩连续相同的元素
Show(dice,1);
dice.sort();//sort函数用法
two.sort();
Show(dice,1);
Show(two,0);
dice.merge(two);//merge函数用法,将two合并到dice中,two将为空。
Show(dice,1);
Show(two,0);
dice.remove(2);//移除所有2
Show(dice,1);
return 0;
}insert()与splice()之间的不同主要在与:insert()将原始区间的副本插入到目标地址,而splice()则将原始区间移到目标地址。splice()执行后,迭代器仍有效。也就是说原本指向two中一个元素的迭代器,在使用过splice后仍然指向它。
remove()函数还有更加方便的拓展,将在以后讲到。
(四)queue
头文件
头文件
关联容器(map与set)详解