STL容器:序列容器关联容器

在STL中容器为数据存储的基础,容器主要分为序列容器和关联容器

一、序列容器

vector--------连续存储元素,单向的;

list------------由节点组成的不连续存储的双向链表

deque--------------连续存储元素,双向的.


1、顺序容器主要分为vector, deque, list。

2、容器内的元素类型必须至少满足2个条件:可复制和可赋值。

3、list容器的迭代器,不支持算术运算,不支持关系运算,也没有下标操作,只有最简单的自增 自减 、相等、 不等 、运算。

4、所有的 迭代器范围都是左闭合区间,  [begin,end)  包括begin,但不包括end

5、顺序容器定义的几种类型:

size_type  容器大小

iterator  迭代器

  reverse_iterator 逆序迭代器

const_iterator 只读迭代器(指向的元素只读),

  const_reverse_iterator反向只读迭代器(指向的元素只读),

difference_type  迭代器的差值,可为负值

value_type 元素类型

reference 相当于 value_type&,即指向迭代器对应的元素

const_reference 相当于const value_type &

6、a.begin() a.end() 对应于 iterator,a.rbegin()  a.rend() 对应于reverse_iterator,

注意:如果a是const,那么对应的iterator也必须是const_iterator


7、添加元素操作:

a.push_back(t);  在a末尾增加元素t;

a.push_front(t);  在a前端增加元素t,只使用于list和deque

a.insert(p,t);  在迭代器p前面插入元素t,返回新元素的迭代器

a.insert(p,n,t); 在迭代器p前面插入n个元素t,返回void

a.insert(p,b,e);在迭代器p前面插入迭代器b,e标记的范围内的元素,返回void


8、删除元素操作:

a.pop_back();删除a的最后一个元素,返回void,如果a为空,则函数未定义

a.pop_front();删除a的第一个元素,返回void;如果a为空,则函数未定义(只适用于list和deque);

a.erase(p);  删除迭代器p指向的元素,返回下一个元素的迭代器;

a.erase(b,e);删除迭代器b,e之间的元素,返回下一个元素的迭代器

a.clear();删除a的所有元素,返回void


9、容器空间大小操作:

a.size() 元素个数 c.max_size() 最大元素个数

a.empty() bool值,指示a是否为空

c.resize(n,t) 重置c的大小为n,且 新增加的元素初始化为t。


10、a.begin()  a.end()类型为iterator,a.front()  a.back()类型eference

注意:vector<int>::reference  last=a.back(),last1=*--a.end();a.back指向最后一个元素,a.end指向最后一个元素的下一位置


11、顺序容器赋值操作:

c1=c2;  

c1.swap(c2);  c1 c2 互换

c.assign(b,e);  将迭代器b,e之间的元素复制给c

c.assign(n,t); 将c设置为n个值为t的元素

注意:以上操作,都是首先删除c原来的所有元素后再进行的操作


二、关联容器(associative container)

map,multimap类------------#include<map>
set,multiset 类  --------------- #include<set>

关联容器:通过键存储和读取元素;顺序容器:通过元素在容器中的位置顺序存储和读取元素。

关联容器map的用法:
1、map的定义
map<k,v> m;   k为键类型,v为值类型
map<k,v> m(m2);
map<k,v> m(b,e); 将迭代器b e 之间的元素复制到m

2、键类型必须满足严格弱排序,即 < 一定要定义,且大于 等于时都视为等于关系
如 p1<p2,表示p1.first()<p2.first()||  (!(p1.first()<p2.first)&&p1.second()<p2.seconf() )

3、map的类型
map<k,v>::key_type  键类型,而且是const的, const k
map<k,v>::mapped_type  值类型,v
map<k,v>::value_type  键-值对应的pair类型,pair<k,v>

4、使用下标访问map对象,可以直接添加新元素
map<string,int> w;   w["ab"]=2;
如果w中不存在ab键,则会自动添加一个value_type,设置为"ab"--2

5、对map迭代器解引用,返回value_type
对map进行下标操作,返回mapped_type

6、map.insert(e);  e为pair类型,如果其键不存在,则新建;如果键已经存在,则m不变;
返回值为pair类型,其中pair.first为指向此键的迭代器,pair.second为bool,指示是否插入了该元素。
m.insert(beg,end); 插入迭代器范围,返回void,规则同上
m.insert(iter,e); iter为迭代器,以iter为起点搜索,查找是否有e.first对应的键元素,如果没有,则插入e。返回一个迭代器,指向具有e.first键的元素

7、删除map中元素:
m.erase(k); 删除键k对应元素,返回删除个数(map中,只能为0或者1)
m.erase(p);删除迭代器p对应元素,返回void
m.erase(b,e);删除迭代器b e之间元素,返回boid

8,检查map中键是否存在:
m.count(k)  返回键k在m中出现的次数
m.find(k)  返回键k在m中首次出现的迭代器;不存在则返回末端迭代器

9、map中,内存存在方式类型list是不连续的。
所以,map的迭代器只有简单的自增 自减操作,而且map中没有push pop相关操作。
但是,map提供下标操作,只是它的下标操作和顺序容器是不一样的。



关联容器set:
set与map不同的地方在于:set仅有key_type类型,它的value_type也就是key_type;而且set不提供下标操作。
set也支持count find 操作,类似map。

关联容器multimap  multiset:
一个键可以对应多个实例
1、insert总会添加一个新元素,不管键是否存在
2、erase会删除拥有该键的所有元素
3、在multimap中,拥有相同键的元素是相邻存放的 。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值