和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); } |
要注意的是,其返回值是一个pair,由一个迭代器和一个bool值组成,后者表示插入是否成功,成功的话前者即指向被插入的那个元素。
5、map的subscript(下标)操作符,用法有两种。可能作为左值运算符(内容可被修改),也可能作为右值运用(内容不可被修改)。例如:
1234 | map<string, int > simap; //以string为键值,int为实值 simap[string( "oyjb" )] = 1; //以左值运用 ... int number = simap = simap[string( "oyjb" )]; //右值运用 |
但是无论如何,subscript操作符的工作,都得先根据键值找出其实值,再作打算。