现在的位置: 首页 > 综合 > 正文

顺序容器

2013年04月14日 ⁄ 综合 ⁄ 共 3625字 ⁄ 字号 评论关闭

顺序容器类型

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

【上篇】
【下篇】

抱歉!评论已关闭.