Chinaunix首页 | 论坛 | 博客
  • 博客访问: 496942
  • 博文数量: 111
  • 博客积分: 3160
  • 博客等级: 中校
  • 技术积分: 1982
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-24 11:49
个人简介

低调、勤奋。

文章分类

全部博文(111)

文章存档

2014年(2)

2013年(26)

2012年(38)

2011年(18)

2010年(27)

分类: C/C++

2012-12-22 20:19:21

一、 顺序容器类型

顺序容器
vector 支持快速随机访问,相当于数组
list       支持快速插入和删除,相当于链表
deque  双端队列

顺序容器适配器

statck  后进先出(LIFO)堆栈
queue  先进先出(FIFO)队列
priority_queue  有优先级管理的队列

二、头文件
#include
#include
#include

所用容器都是类模版
vector svec;
list            ilist;
deque item;

三、初始化

1、将一个容器初始化另一个容器的副本。
vector ives;
vector ivec2(ivec);

将一个容器负责给另一个容器时,类型必须匹配:容器类型和元素类型都必须匹配。

2、不能直接将一种容器内的元素复制给另一种容器,可以通过传递一对迭代器间接实现该功能。
list slist(svec.begin(), svec.end());

3、查找容器的中间点
vector::iterator mid = svec.begin() + svec.size()/2;

4、初始化front队列,采用svec的前半部分,不包括*mid
deque front(svec.begin(), mid);

5、初始化back,采用svec的后半部分。
deque back(mid, svec.begin());

6、分配和初始化指定数目的元素
const list::size_type list_size = 64;
list slist(list_size "eh");

四、容器类元素的类型约束

1、元素类型必须支持赋值运算。
2、元素类型的对象必须可以复制。

引用不支持一般意义的赋值运算,因为没有元素是引用类型的容器。

五、容器中的容器

vector< vector > //注意<> 中间需要使用空格,表示这是两个分开的符号,否则、
系统会认为 >> 是单个符号,为右移操作符。

六、迭代器和迭代器的范围
常用迭代器运算

*iter 返回迭代器iter所指向的元素的引用
++iter
--iter
iter != iter2

verctor 和 deque 支持 iter + n 操作,list为链表形式不支持 + n 操作。

list容器既不支持算法运算(加减法),也不支持关系运算(<=,>=),只支持自增和自减、相等
不等运算。

七、容器的begin和end操作

c.begin()  返回一个迭代器,指向容器c的第一个元素    
c.end()     返回一个迭代器,指向容器c最后一个元素的下一个位置    
c.rbegin()  返回给一个逆序迭代器,指向容器c的最后一个元素
c.rend()     返回给一个逆序迭代器,它指向容器c的第一个元素的前面的位置

八、在顺序容器中添加元素

关键概念:容器元素都是副本,在容器中添加元素时,系统是将元素值复制到容器中。

c.push_back(t)  在容器的尾部添加值为t的元素,返回void类型

c.push_front(t)  在容器c的前端添加值为t的元素,返回vod类型,只适用list和deque类型。

c.insert(p,t)    在迭代器p所指向的元素前面插入值为t的新元素,返回指向新添加元素的迭代器。

c.insert(p, n, t) 在迭代器p所指向的元素插入n个值为他、的新元素,返回void类型

cinsert(p, b, e) 在迭代器p所指向的元素前面插入由迭代器b和e标记的范围内的元素,返回void类型。

九、顺序容器的大小操作

c.size()  返回容器c中的元素个数,返回类型为c::size_type

c.max_size()  返回容器c可容纳的最多元素个数,返回类型为c::size_type

c.empty 返回标记容器大小是否为0的布尔值。

c.resize(n) 调整容器c的长度大小,使其能容纳n个元素,如果 n < c.size(),则删除多出来的元素。否则
采用初始值添加新元素。

c.resize(n, t) 调整容器c的长度大小, 使其能容纳n个元素, 所有新添加的元素值都为t。

十、访问顺序容器内元素的操作

c.back()    返回容器c的最后一个元素的引用,如果c为空,则该操作未定义

c.front()    返回容器c的第一个元素的引用,如果c为空,则该操作未定义

c[n] 返回下标为n的元素的引用,只适用于vector和deque

c.at(n) 返回下标为n的元素的引用,只适用于vector和deque

十一、删除元素

c.erase(p) 删除迭代器p所指向的元素,返回一个迭代器,它指向被删除元素后面的元素,如果p指向
容器内的最后一个元素,则返回迭代器所指向容器的超出末端的下一位置。

c.erase(b, e) 删除迭代器b和e所标记的范围内所有元素

c.clear() 删除容器c内的所有元素。返回void

c.pop_back()  删除容器c的最后一个元素。返回void,如果c为空容器,则该操作未定义

c.pop_front() 删除容器c的第一个元素、返回void。只适用于list或者deque容器。

十二、赋值与swap操作

赋值操作为先删除左操作数容器中的所有元素,然后将右操作数容器的所有元素inserts到左边容器中。

c1 = c2 删除容器c1的所有元素,然后将c2的元素复制给c1.

c1.swap(c2) 

c.assign(b, e)

c.assign(n ,t)

十三、vector容器的自增长
 
vector容器由于是顺序存储了,为了避免新增元素时,需要重新分配内存,在初次分配时会分配一个较大的内存空间,在后面当内存不够时,会采用加倍当前容量的分配策略实现重新分配。
 
十四、容器的选择
list容器表示不连续的内存区域,允许向前和向后逐个遍历元素。在任何位置都可高效插入和删除元素。但是不支持随机访问。
 
1、程序如果要求随机访问,则使用vector或deque
2、如果程序必须在容器的中间插入或删除元素,则应采用list元素。
3、如果程序不是在容器的中间位置,而是在容器的首部或尾部插入或删除元素。则应采用deque容器。
 
 
 





阅读(940) | 评论(0) | 转发(0) |
0

上一篇:测试离线编辑器啊

下一篇:阿尔法波音乐

给主人留下些什么吧!~~