关联容器(associative-container)
-
- map 关键字-值对
- multimap 允许关键字重复
-
头文件
- set 只储存关键字
- multiset 允许关键字重复
-
<unordered_map>头文件
- unordered_map 不保持关键字的顺序,使用哈希函数来组织元素。
- unordered_multimap
-
<unorderer_set>头文件
- unordered_set
- unordered_multiset
-
关联容器的迭代器都是双向的
-
有序容器需关键字类型定义比较方法,默认使用<,其必须是在关键字类型上定义的一个严格弱序(strict weak ordering)
pair
- pair<T1,T2> p
- pair<T1,T2> p(v1, v2)
- pair<T1,T2> p = {v1, v2}
- make_pair(v1, v2) 返回一个用v1,v2初始化的pair,自动进行类型推断
- p.first 数据成员 T1类型的对象
- p.second 数据成员 T2类型的对象
- p1 relop p2 关系运算符 只要p1.first relop p2.first 和 p1.second relop p2.second中有一个成立,p1 relop p2就成立
- p1 == p2
- p1 != p2
map
- map<KeyType, ValueType> m
- C++11值初始化:关键字-值对包围在花括号中 {key, value}
map<string, int> m = {{"Hello",1}, {"World",2},{"!",3}};
- map<KeyType, ValueType, Compare> m 提供比较方法,KeyType没有定义<就必须提供比较方法。
- m.key_type 类型:KeyType
- m.mapped_type 类型: ValueType
- m.value_type 类型:pair<const KeyType, ValueType>
- 对map容器的迭代器解引用或使用下标将得到value_type类型的对象,即pair<const KeyType, ValueType>
- 关键字不能修改,只能修改值
- m.begin()
- m.end()
- m.insert(v) 应传入相应的pair类型
- m.emplace(args) 构造一个元素
- m.insert(p, v) / c.emplace(p, args) p为一个迭代器,作为一个提示,指出从哪里开始搜索新元素应该储存的位置。
- m.insert(b,e)
- m.insert(il)
- 插入相同的关键字对容器无影响
- insert和emplace返回一个pair,包含一个迭代器,指向具有指定关键字的元素,以及一个指示插入是否成功的bool值
- insert(b,e)/insert(il)时返回void
- m.[key] (map/unordered_map拥有) 返回关键字为key的元素(pair),如果关键字不存在,则在map中新建一个元素
- c.at[key] 带参数检测的访问,不存在则抛出out_of_range
set
- set s
- set s = {…}
- s.key_type 类型: KeyType
- s.value_type 类型: 与key_type相同,KeyType
- set的关键字不能修改,即使使用iterator
- m.begin()
- m.end()
…
insert的返回值
- map/set 不可插入重复关键字的,insert重复关键字时什么也不做->返回pair
- first为指向具有给定关键字的元素的迭代器
- second为bool类型,true表示插入成功,false表示未成功(重复)
- multimap/multiset 可插入重复关键字的->返回迭代器
erase
- c.erase§ 接收迭代器,返回后一个元素的迭代器
- c.erase(b,e) 接收迭代器范围,返回e
- c.erase(key) 接收关键字,返回删除的元素的个数
元素访问
- c.find(k) 返回第一个关键字为k的元素的迭代器,不存在返回尾后迭代器
- c.count(k) 返回数量
- c.lower_bound(k) 返回迭代器,指向第一个关键字大于等于k的元素
- c.upper_bound(k) 返回迭代器,指向第一个关键字大于k的元素
- c.equal_range(k) 返回一个迭代器pair,指示关键字等于k的元素的范围
无序容器(unorder associative container)
不使用比较运算符组织元素,而使用哈希函数(hash function)和关键字的==运算符
- 标准库为内置类型,string,智能指针提供了hash模板(hash<key_type> 可调用对象类型)来生成元素的哈希值->可以直接定义它们的无序容器
- 为自定义类型提供hash函数,和==
size_t hasher(const A& rhs){
return ...;
}
bool equation(const A& a, const A& b){
return ...;
}
unordered_map<A, int, decltype(hasher)* , decltype(equation)* > um(42, hasher, equation); //参数:桶大小,hash函数,比较函数
//如果类型有==操作,可以不传递