关联式容器

所谓关联式容器:每个元素都有一个键值和一个实值(键值对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[ ] 的效率更高。
    几种初始化方式:
  1. std::map<std::string, int>myMap;
  2. std::map<std::string, int>myMap{ {"key1",10},{"key2",20} };
  3. std::map<std::string, int>myMap{ std::make_pair("key1",10),std::make_pair("key2",20) };//和第二种方式等价
  4. 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,杜绝写入操作
    几种初始化方式:
  1. std::setstd::string myset;
  2. std::setstd::string myset{"A", "B", "C"};
  3. std::setstd::string copyset(myset);

multiset

  • 和 set容器的区别在于,multiset容器中可以同时存储多(≥2)个键相同的键值对。
  • 底层机制是调用了RB-tree的insert_equal,而非insert_unique
posted on 2021-04-09 00:11  逆流而上の鱼  阅读(157)  评论(0编辑  收藏  举报