时间:2014.03.30
地点:基地
--------------------------------------------------------------------
一、简述
关联容器支持高效的关键字查找和访问,与顺序容器不同,关联容器中的元素是按关键字来保存和访问的。两个主要关联容器是map和set。map中的元素是一些关键字-值对,关键字起到索引作用,值则表示和索引相关联的数据。而set中每个元素只包含一个关键字,支持高效的关键字查询操作。一下对常见 的关联容器进行总结。
1.按关键字有序保存元素
头文件 map中
map 关联数组:保持关键字-值对
multimap 关键字可重复出现的map
头文件 set中
set 关键字即值,即只保存关键字的容器
multiset 关键字可重复出现的set
2.无序集合
头文件 unordered_map 中
unordered_map 用哈希函数组织的map
unordered_multimap 哈希组织的map,关键字可重复出现
头文件nuordered_set 中
unordered_set 用哈希函数组织的set
unordered_multiset 哈希组织的set,关键字可以重复出现
对于map类型来说,存储的是键值对,类似于字典,对于set来说,只是简单关键字的集合,当只想知道一个值是否存在时,set最管用。
--------------------------------------------------------------------
二、map的使用
单词计数程序:统计每个单词在输入中出现的次数
#include<map> #include<iostream> #include<string> using namespace std; int main(){ string word; map<string, size_t> word_count; //空的map容器 string word; while (cin >> word) ++word_count[word]; for (const auto& w : word_count) cout << w.first << " occurs " << w.second << ((w.second > 1) ? " times" : " time") << endl; }while循环每次从标准输入读取一个单词,将单词作为索引,对关联的size_t类型计数器进行操作,如果word还不在map中,下标运算会创建一个新元素,关键字为word,值为0。再在此基础上进行加1操作。for范围语句则遍历map,每次遍历得到一个pair类型对象,pair的first数据成员保存关键字,second数据成员保存对应的值。
初始化map时,必须提供关键字-值对,并包括在花括号中,比如: {key,value} 形式形成一种映射关系,这样还可以初始化列表的形式初始化map容器,比如:
mat<string,string> authors={ {"Joyce","James"}, {"Austen","Jane"}, {"Dickens","Charles"} };--------------------------------------------------------------------
三、set的使用
前面已经提及,set只保存关键字,即set没有值,对于要检查某个值是否存在时set很管用,比如扩展上面程序,我们想忽略常见的单词,即统计不再集合中的单词:the and or 等连接词,可以如下修改实现:
#include<map> #include<set> #include<iostream> #include<string> using namespace std; int main(){ string word; map<string, size_t> word_count; set<string> exclude = { "The", "But", "And", "Or", "An", "A", "the", "but", "and", "or", "an", "a" }; while (cin >> word){ if (exclude.find(word) == exclude.end()) ++word_count[word]; } for (const auto& w : word_count) cout << w.first << " occurs " << w.second << ((w.second > 1) ? " times" : " time") << endl; }set集合可以进行列表初始化,我们在if语句中完成单词检查是否在忽略集合当中,find成员函数的调用将返回一个迭代器,如果给定关键字在set中,迭代器指向该关键字,否则返回的是一个尾后迭代器。
--------------------------------------------------------------------
四、初始化multimap和multiset
map和set中的关键字必须是唯一的,即给定关键字只有存在一份,而multimap和multiset没有此限制,这种用途比如在一个词典中一个单词对应了多份解释。以下是一个初始化set和multiset的例子:
#include<set> #include<iostream> #include<vector> using namespace std; int main(){ vector<int> ivec; for (vector<int>::size_type i = 0; i != 10; ++i){ ivec.push_back(i); ivec.push_back(i); } set<int> iset(ivec.cbegin(), ivec.cend()); multiset<int> miset(ivec.cbegin(), ivec.cend()); cout << ivec.size() << endl; cout << iset.size() << endl; cout << miset.size() << endl; return 0; }