11.1 使用关联容器
按关键字有序保存元素 | |
map | 关联数组。保存关键值-对 |
set | 关键字即值,即只保存关键字的容器 |
multimap | 关键字可重复出现的map |
multiset | 关键字可重复出现的set |
无序集合 | |
unordered_map | 用哈希函数组织的map |
unordered_set | 用哈希函数组织的set |
unordered_multimap | 哈希组织的map,关键字可以重复出现 |
unordered_multiset | 哈希组织的set,关键字可以重复出现 |
11.2 关联容器概述
11.2.3 pair类型
pair<T1, T2> p | 定义一个pair类型对象,两个类型分别为T1和T2的成员都进行了值初始化 |
pair<T1, T2> p(v1, v2) | 定义一个pair类型对象,first和second成员分别用T1和T2进行初始化 |
pair<T1, T2>p = {v1, v2} | 等价于p(v1, v2) |
make_pair(v1, v2) | 返回一个用v1和v2初始化的pair,pair的类型从v1和v2的类型推断出来 |
p.first | 返回p的名为first的公有数据成员 |
p.second | 返回p的名为second的公有数据成员 |
11.3 关联容器操作
key_type | 此容器类型的关键字类型 |
mapped_type | 每个关键字关联的类型;只适用于map |
value_type | 对于set,与keytype相同 对于map,为pair<const key_type, mapped_type> |
11.3.1 关联容器迭代器
1、解引用一个关联容器的迭代器,会得到一个类型为容器的value_type的值的引用。
auto map_it = word_count.begin();
//*map是指向一个pair<const string, size_t>对象的引用
cout<<map_it->first;
cout<<map_it->second;
map_it->first = "new key"; //error 关键字是const的
map_it->second++; //right 可以通过迭代器改变元素
11.3.2 添加元素
1、关联容器的insert操作
c.insert(v) | v是value_type类型的对象 |
c.insert(b, e) | b和e是迭代器,表示一个c::value_type类型值的范围 |
。。。 |
//针对map容器类型,value_type是pair类型
word_count.insert({word, 1});
word_count.insert(make_pair(word, 1));
word_count.insert(pair<string, size_t>(word, 1));
word_count.insert(map<string, size_t>::value_type(word, 1));
11.3.3 删除元素
c.erase(k) | 从c中删除每个关键字为k的元素,返回一个size_type值,指出删除元素的数量 |
c.erase(p) | 从c中删除迭代器p指定的元素。p必须指向c中一个真实元素,不不能等于c.end()。返回一个指向p之后元素的迭代器,若p指向c中的尾元素,则返回c.end() |
c.erase(b, e) | 删除迭代器对b和e所表示的范围中的元素。返回e |
11.3.4 map的下标操作
c[k] | 返回关键字为k的元素;如果k不在c中,添加一个关键字为k的元素,对其进行值初始化 |
c.at(k) | 返回关键字为k的元素,带参数检查;若k不在c中,抛出一个out_of_range异常 |
1、通常情况下,解引用一个迭代器(vector、string)所返回的类型与下标运算符返回的类型是一样的。但对map来说,当对一个map进行下标操作时,或获得一个mapped_type对戏那个;但当解引用一个map迭代器时,会得到一个value_type对象。
11.3.5 访问元素
c.find(k) | 返回一个迭代器,指向第一个关键字为k的元素,若k不在容器中,则返回尾后迭代器 |
c.count(t) | 返回关键字等于k的元素的数量,对于不允许重复关键字的容器,返回值永远是0或1 |
。。。 |
1、对map使用find代替下标操作
if (word_count.find("tool_bar") == word_count.end()) {
cout << "tool_bar is not in the map" <<endl;
}