关联式容器map/multimap

时间:2022-12-03 20:50:06

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

123456789 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函数
1234 pair<iterator,bool> insert(const value_type &x){    return t.insert_unique(x);}
此式将工作转给底层的RB-tree的insert_unique()去执行。
要注意的是,其返回值是一个pair,由一个迭代器和一个bool值组成,后者表示插入是否成功,成功的话前者即指向被插入的那个元素。
5、map的subscript(下标)操作符,用法有两种。可能作为左值运算符(内容可被修改),也可能作为右值运用(内容不可被修改)。例如:
1234 map<string,int> simap;  //以string为键值,int为实值simap[string("oyjb")] = 1; //以左值运用...int number = simap = simap[string("oyjb")];//右值运用
左值或者右值都适用的关键在于,返回值采用by reference传递形式。

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