顺序容器类型
1.顺序容器
vector 支持快速随机访问
list 支持快速插入/删除
deque 双端队列
2.顺序容器适配器
stack 后进先出 栈LIFO
queue 先进先出FIFO队列
priority_queue 有优先级队列
头文件
# include<stack>
#include<list>
#include<queue>
所有的容器都是类模板 必须在容器后面加个<> 括号内放的容器的类型,所有的容器都有构造函数,用来创建指定的空容器对象,默认的构造函数是不带参数的。
容器的初始化
C<T> c;创建名字为c的容器,C是容器类型名 ,T元素类型 如int string
C c(c2) 创建c2的副本 ,c和c2必须是相同类型的容器类型,并且存放相同类型的元素,使用于所有 的容器类型。
C c(b,e) 创建容器c 其元素是b,e标示范围内的元素
C c(n,t) 用n个t的元素来创建容器c,其中t必须是C的元素类型的值。只适用于顺序容器。
C c(n) 创建有n个值初始化元素的容器 c。 只适用于顺序容器。
1.将一个容器初始化为另一容器副本。
vector <int > ivec;
vector<int > ivec2(ivec); //必须是同一容器类型,同一元素类型。
2.初始化一段元素的副本
1) 初始换slist成为svec的副本
list<string> slist(svec,begin(),svec,end());
2)找到容器的中间点
vectro<stirng>::iterator mid = svec.begin()+sevc.size()/2;
3)初始化前一半元素 ,不包括中间点mid
deque<string> front(svec.begin(),mid);
4)初始化后半截元素 ,包括中间点
deque<stiring> back(mid,svec.end());
3.分配和初始化指定数目的元素
创建容器时,可显式的指定容器的大小和一个可选元素的初始化
const list<int>::size_type list_size = 64;
list<string> slist(list_size,"en?");
容器内部元素类型约束
1)元素类型必须支持赋值运算
2)元素类型那个的对象必须可以复制。
容器 的容器 vector<vectro<> >lines 必须要用空格隔开 否则会认为>>是右移
迭代器和迭代器的范围
首先介绍了vector的迭代器,每种类型容器都有提供若干共同工作的迭代器类型,与容器一样迭代器具有相同的接口。
常用迭代器的运算
*iter 返回迭代器所指向的元素
iter->mem 对iter进行解引用 获取元素中名为mem的元素。等效于 (*iter).mem
++iter 给iter+1, 指向容器下一个元素
iter++ 给iter+1, 指向容器下一个元素
--iter
iter--给iter-1 ,指向容器前一个元素
iter1 == iter2 比较两个迭代器是否相等 ,是否指向同一个元素。
iter !=iter2;
vectro 和queue 容器迭代器的提供额外的运算
iter + n
iter - n;
iter+= iter2;
iter--=iter2;
iter1- iter2; 同一容器 的元素或者超出容器末尾的下一个位置。
< > >= <=
slist .begin()+slist.size()/2;是错误的 不支持算数操作。
迭代器的范围
通常命名 为first 和last 或者 beg 和end
尽管last 和end这个名字很常见 ,但是容易引起误会,其实第二个迭代器从来不指向元素范围的最后一个元素,而是指向左后一个元素的下一个位置,范围包括first 到last之前的所有元素。如果两个迭代器相等那么迭代器范围为空。左闭合区间 [first,last)
容器定义的类型别名
size_type 无符号类型,足以存储次容器类型最大可能容器长度。
iterator 此容器类型的迭代器类型。
const_iterator 元素只读迭代器
reverse_iterator 逆序寻址元素的迭代器
const_reverse_iterator 元素的只读不能写逆序迭代器
different_type 足够存储两个迭代器差值的有符号整型
valuse_type 元素类型
reference 元素的左值类型
const_refernece 元素的常量左值类型
容器的begin 和end操作
c.begin() 返回一个迭代器,它指向容器c的第一个元素
c.end () 返回一个迭代器,他指向容器c的最后一个元素的下一个位置。
c.rbegin() 返回个逆序迭代器 ,他指向容器c的最后个元素。
c.rend()返回一个逆序的迭代器,指向c的第一元素前面的位置。
在顺序容器中添加元素
string text_word;
while(cin>> text_word)
container.push_back(text_word);
在顺序容器中添加元素的操作
c.push_back(t)在容器的尾部添加值为t的元素 ,返回void值。
c.push_front(t)在容器的前端添加值为t的元素 ,返回void值。
只适用list 和deque容器类型
c.insert(p,t) 在迭代器p所指向元素前面插入值为t的新元素,返回指向添加新元素的迭代器。
c.insert(p,n,t) 在迭代器p所指向元素前面插入n个值为t的新元素,返回void
c.insert(p,b,e)在迭代器p所指向元素前面插入值为(b和e标记的范围内)的新元素,返回void
容器大小的操作
c.size() 返回容器c中的元素个数。
c.max_size() 返回容器c中容纳的最多元素个数
c.empty()。返回标记容器大小是否为o的BOOL值
c.resize(n)调节容器c的长度大小 ,使其能容纳n个元素。
c.resize(n,t) 调节容器长度大小,使其能容纳n个元素,而且所添加的元素都是t。
访问元素
获取第一最后一个元素值的四种方法
if(!ilist.enpty)
{
list<int>::reference val = *ilist.begin();
list<int>refenence val2 = ilist.front();
list <int>::reference last = *--ilist.end();
list<int >::refernece last2 = ilist.back;
}
删除顺序容器的元素操作
c.erase(p) 删除迭代器p指向的元素
c.erase(b,e) 删除迭代器b和e所标记的范围能所有元素
c.clear() 删除容器内所有元素的值 , 返回void
c.pop_back() 删除容器c的最后一个元素 回回void
c.pop_front 删除c的第一元素 ,返回void
删除第一个或最后一个元素
pop_front 和pop_back函数用于删除容器内的第一个和最后一个元素 ,但是vector不支持这两种操作
while(!ilist.empty)
{
process(ilist.front());
ilist .pop_front;
}
删除容器内的一个元素
string searchValue("quasimodo");
list<string>::iterator iter = find()slist.begin(),slist,end(),searchValue;
if(iter !=slist.end())
slist.erase(iter);
注意 pop_front 和pop_back返回的void ,不是删除的值 ,所以在删除前要用front()或者back()。
删除容器内所有的元素
slist.clear();
slist.erase(slist,begin(),slist.end)
删除部分元素
elem1 = find(slist,begin(),slist,end,val1);
elem2 = fine(enem1,slist,end(),val2)
slist.earse(elem1,elem2)
删除从[elem1 ,elem2)
顺序容器的赋值操作
c1 = c2 删除c1中所有元素, 将c2赋值到c1;
c1.swap(c2) 交换两个容器中的值 , 必须类型相同
c.assign(b,e) 重新设置c的元素 将时代起b和e标记范围内所有的元素复制到c, b和e不能是指向c中的元素迭代器。
c.assign(n,t)将容器c中的重新设置为储存n个值为t的元素。
容器的选用
如果程序要求随机访问元素 , 则使用vector 和deque
如果需求中间插入 或者删除元素 ,则用list
如果不是在容器中间插入或者删除 用deque