关联式容器map/multimap

和set相比,map同时拥有实值(value)和键值(key),其每一个元素都是pair,pair的第一个元素是键值,第二个元素是实值。map和multimap的区别在于,map不允许两个元素拥有相同的键值,而multimap允许存在重复的键值。pair<key,value>
pair定义如下:

1
2
3
4
5
6
7
8
9
template <class T1, class T2>  
struct pair  
{  
     typedef T1 first_type;  
     typedef T2 second_type;  
   
     T1 first;  
     T2 second;  
}  
迭代器

map和set的底层实现都是很RB-tree,其迭代器特点和set一致。

我们可以通过map的迭代器来改变元素的实值。

1、如果想要修改元素的键值,不行。任意改变元素的键值会严重破坏map组织。但如果像修改元素的实值,可以。因为map元素的实值并不影响map元素的排列规则。因此,map iterator既不是一种constant iterators也不是一种mutable iterators

2、map拥有与list相同的而某些性质:当用户对它进行元素新增操作(insert)或者删除(erase)时,操作之前的所有迭代器,在操作完成之后都依然有效。当然,被删除的那个迭代器必然是个例外。

3、由于RB-tree是一种平衡二叉搜索树,自动排序的效果很好,所以标准STL map即以RB-tree为底层实现机制。又由于map所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的map操作行为,都只是转调用RB-tree的操作行为而已。

4、针对map的insert函数
1
2
3
4
pair<iterator, bool > insert( const  value_type &x)
{
     return  t.insert_unique(x);
}
此式将工作转给底层的RB-tree的insert_unique()去执行。

要注意的是,其返回值是一个pair,由一个迭代器和一个bool值组成,后者表示插入是否成功,成功的话前者即指向被插入的那个元素。

5、map的subscript(下标)操作符,用法有两种。可能作为左值运算符(内容可被修改),也可能作为右值运用(内容不可被修改)。例如:
1
2
3
4
map<string, int > simap;   //以string为键值,int为实值
simap[string( "oyjb" )] = 1;  //以左值运用
...
int  number = simap = simap[string( "oyjb" )]; //右值运用
左值或者右值都适用的关键在于,返回值采用by reference传递形式。

但是无论如何,subscript操作符的工作,都得先根据键值找出其实值,再作打算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值