关联式容器
所谓关联式容器:每个元素都有一个键值和一个实值(键值对pair)。当元素被插入到关联式容器中时,容器内部结构便依照其键值大小,
以某种特定规则将这个元素放置于适当位置。关联式容器没有所谓头尾(只有最大元素和最小元素)。
先看底层采用红黑树(RB-tree)的四种容器:map、set、miltimap、multiset
“键值对”pair
<stl_pair.h>中pair的定义
template<class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 first_type;
T1 first;//注意它是public
T2 second;//注意它是public
pair():first(T1()),second(T2()){}
pair(const T1& a, const T2& b):first(a),second(b){}
};//摘自《STL源码剖析》
map
- 使用 map 容器存储的各个键值对,键的值既不能重复也不能被修改
- 在使用 map 容器存储多个键值对时,该容器会自动根据各键值对的键的大小,按照既定的规则进行排序。默认情况下,
map 容器选用std::less排序规则(其中 T 表示键的数据类型),其会根据键的大小对所有键值对做升序排序。 - 当实现“向 map 容器中添加新键值对元素”的操作时,insert() 成员方法的执行效率更高;而在实现“更新 map 容器指定键值对的值”的操作时,operator[ ] 的效率更高。
几种初始化方式:
- std::map<std::string, int>myMap;
- std::map<std::string, int>myMap{ {"key1",10},{"key2",20} };
- std::map<std::string, int>myMap{ std::make_pair("key1",10),std::make_pair("key2",20) };//和第二种方式等价
- std::map<std::string, int>newMap(myMap);
multimap
- 和 map 容器的区别在于,multimap 容器中可以同时存储多(≥2)个键相同的键值对。
- 底层机制是调用了RB-tree的insert_equal,而非insert_unique
set
- 所有元素会根据键值进行排序,默认选用std::less
排序规则(其中 T 表示键的数据类型) - set元素的键值就是实值,实值就是键值,且不允许,两个元素有相同的键值
- 元素不可改变,虽然接口没限制。但是set源码中,set
::iterator被定义为底层的RB-tree的const_iterator,杜绝写入操作
几种初始化方式:
- std::setstd::string myset;
- std::setstd::string myset{"A", "B", "C"};
- std::setstd::string copyset(myset);
multiset
- 和 set容器的区别在于,multiset容器中可以同时存储多(≥2)个键相同的键值对。
- 底层机制是调用了RB-tree的insert_equal,而非insert_unique