没写完

容器概述
可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是类模板,分为3种:
1 顺序容器
vector(动态数组) deque(双向队列) list (双向链表)
2 关联容器
set multiset map multimap
3 容器适配器
stack(栈) queue(队列) priority_queue(优先队列)

顺序容器简介
容器并非排序的,元素的插入位置同元素的值无关。

*vector 头文件 < vector >
动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能(大部分情况下是常数时间)

*deque 头文件 < deque >
双向队列。元素在内存连续存放。随机存取任何元素都能在常数时间完成(但次于vector)。在两端增删元素具有较佳的性能(大部分情况下是常数时间)。

*list 头文件< list >
双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取。

关联容器简介
*元素是排序的
*插入任何元素,都按相应的排序规则来确定其位置
*在查找时具有非常好的性能
*通常以平衡二叉树方式实现,插入和检索的时间都是o(log(n))

*set/multiset 头文件< set >
set即集合。set中不允许相同元素,multiset中允许存在相同的元素。

*map/multimap 头文件< map >
mao与set的不同在于map中存放的元素有且仅有两个成员变量,一个名为first,另一个名为second,map根据first值对元素进行从小到大排序,并可快速地根据first来检索元素
map同multimap的不同在于是否允许相同first值的元素

容器适配器简介

*stack 头文件< stack >
栈。是项的有限序列,并满足序列中被删除,检索和修改的项只能是最近插入序列的项(栈顶的项)。后进先出。

*queue 头文件< queue >
队列。插入只可以在尾部进行,删除,检索和修改只允许从头部进行。先进先出。

*priority_queue 头文件< queue >
优先级队列。最高优先级元素总是第一个出列

顺序容器和关联容器中都有的成员函数
begin 返回指向容器中第一个元素的迭代器
end 返回指向容器中最后一个元素后面的位置的迭代器
rbegin 返回指向容器中最后一个元素的迭代器
rend 返回指向容器中第一个元素前面的位置的迭代器
erase 从容器中删除一个或几个元素
clear 从容器中删除所有元素

顺序容器的常用成员函数
front 返回容器中第一个元素的引用
back 返回容器中最后一个元素的引用
push_back 在容器末尾增加新的元素
pop_back 删除容器末尾的元素
erase 删除迭代器指向的元素(可能会使该迭代器失效),或删除一个区间,返回被删除元素后面的那个元素的迭代器

迭代器
*用于指向顺序容器和关联容器中的元素
*迭代器用法和指针类似
*有const 和非const 两种
*通过迭代器可以读取它指向的元素
*通过非const迭代器还能修改其指向的元素

定义一个容器类的迭代器的方法可以是:
容器类名::iterator 变量名;
或:
容器类名::const_iterator 变量名;
访问一个迭代器指向的元素:

  • 迭代器变量名

迭代器可以执行++操作,以便其指向容器中的下一个元素。如果迭代器到达了容器中的最后一个元素的后面,此时再使用它,就会出错,类似于使用NULL或未初始化的指针一样。

迭代器示例
vector< int >v;//一个存放int元素的数组,一开始里面没有元素
v.push_back(1); v.push_back(2);v.push_back(3);v.push_back(4);
vector< int >::const_iterator i; //常量迭代器
for(i=v.begin();i!=v.end();++i)//这的!=也可以写成<,但是list中只能写!=,不能写成<,因为list是双向迭代器,只能用==和!=
cout<<*i<<",";//输出结果:1,2,3,4
vector< int >reverse_iterator r; //反向迭代器,与迭代器不兼容
for(r=v.rbegin();r!=v.end;r++)//反向迭代器++操作指向前一个元素
cout<<*r<<",";//输出结果:4,3,2,1
vector< int >::iteratorj;//非常量迭代器(常量迭代器不可以修改其中的值,而非常量迭代器可以)
for(j=v.begin();j!=v.end();j++)
*j=100;
for(i=v.begin();i!=v.end();i++)
cout<<*i<<",";//输出结果:100,100,100,100

*双向迭代器
若p和p1都是双向迭代器,则可对p,p1进行以下操作:
++p,p++ 使p指向容器中下一个元素
–p,p-- 使p指向容器中上一个元素
*p 取p指向的元素
p=p1 赋值
p==p1,p!=p1 判断是否相等,不等

*随机访问迭代器
若p和p1都是随机访问迭代器,则可对p,p1进行以下操作:
双向迭代器的所有操作
p+=i 将p向后移动i个元素
p-=i 将p向前移动i个元素
p+i 值为:指向p后面的第i个元素的迭代器
p-i 值为:指向p前面的第i个元素的迭代器
p[i] 值为:p后面的第i个元素的引用
p<p1,p<=p1,p>p1;p>=p1

容器 容器上的迭代器类别
vector 随机访问
deque 随机访问
list 双向
set/multiset 双向
map/multimap 双向
容器适配器不支持迭代器

*deque
所有试用于vector的操作都适用于deque
deque还有push_front(将元素插入最前面)和pop_front(删除最前面的元素)操作,复杂度是o(1).

list容器
*在任何位置插入删除都是常数时间,不支持随机存取。
*除了具有所有顺序容器都有的成员函数之外,还支持8个成员函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值