关联容器(associative container)支持通过键来高效地查找和读取元素。主要有map和set类型。map的元素以键-值对的形式组织,而set仅包含一个键
map | 关联数组,元素通过键来存储和读取 |
set | 大小可变的集合,支持通过键实现的快速读取 |
multimap | 支持同一个键多次出现的map类型 |
multiset | 支持同一个键多次出现的set类型 |
在创建pair对象时,必须提供两个类型名,pair对象所包含的两个数据成员各自对应的类型名字,这两个类型不必相同。
pair类型的数据成员可以直接访问,其成员分别命名为first和second
关联容器共享大部分(并非全部)的顺序容器操作。关联容器不提供front,push_front,pop_front,back,push_back以及pop_back操作。
键的比较函数“<",必须严格弱排序。所谓严格弱排序就是键类型数据上的“小于”关系,不能出现相互“小于”。如果相互不“小于”则是相等。
map对象的元素是键-值对,map的value_type就反映了这个事实。
map<K,V>::value_type,一个pair类型,它的first元素具有const map<K,V>::key_type类型,而second元素则为map<K,V>::mapped_type类型。
map迭代器进行解引用将产生pair类型的对象。
使用下标访问map与使用下标访问数组或vector的行为截然不同:用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标值。
map容器的insert成员与顺序容器的类似,但需要考虑键的影响。
map对象中一个给定键只对应一个元素。如果试图插入的元素所对应的键已在容器中,则insert不做任何操作。
map容器提供了两个操作:count和find,用来检查某个键是否存在而不会插入该键
m.count(k) 返回m中k的出现次数
m.find(k) 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器。
erase操作可以从map对象中删除元素
关联容器的键都是唯一的,而且不能修改。
set容器是键的集合。当只想知道一个值是否存在时,使用set容器是最合适的。
set容器不提供下标操作符。
关联容器是按顺序存储的。
在multimap和multiset中查找元素的方法:
1.使用find和count操作
2.与众不同的面向迭代器的解决方案
m.lower_bound(k) | 返回一个迭代器,指向键不小于k的第一个元素 |
m.upper_bound(k) | 返回一个迭代器,指向键大于k的第一个元素 |
m.equal_range(k) | 返回一个迭代器的pair对象,它的first成员等价于m.lower_bound(k)而second成员等价于m.upper_bound(k) |
3.equal_range函数返回存储一堆迭代器的pair对象