您的位置:首页 > 编程语言 > C语言/C++

关联式容器map/multimap

2016-04-07 13:43 316 查看
和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操作符的工作,都得先根据键值找出其实值,再作打算。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++