11.1 使用关联容器
相对于顺序容器,关联容器通过关键字来访问存储在容器中的元素。
关联容器有8个。他们都是有不同属性的map和set
muti表示容器可以存储重复元素。unordered表示存储没有顺序
按照关键字有序的容器,头文件在<map><set>中。
无序的在<unorder_map><unorder_set>中。
map
map是关键字-值的即可,它是一个模板,通过关键字来查找对应的value。
在创建一个map对象时,需要指定关键字和值的类型。
使用范围for遍历map元素时,得到的是一个pair对象,pair.first保存关键字,pair.second保存值。
当向map中添加key-value对时,如果map中没有该key,则创建该key的关键字,初始值应该是值初始化。
map<stirng,size_t> my_map;
my_map["a"];//没有该关键字,创建
my_map["a"]=1;//返回引用,赋值为1
set
set是关键字的集合,或者理解为set的关键字和值是同一个值。
可以用来快速的索引,一个值是否在结合中。
操作和map相似。
注意set是自带find函数的,如果找到了元素,则返回指向该元素迭代器,如果没有找到,则返回end()
set<string> my_set;
my_set.find("value")==my_set.end()//判断某个元素是否存在
练习
11.1
1.map属于关联容器,vector属于顺序容器。
2.关联容器通过关键字来访问容器中的元素,顺序容器通过元素在容器中的位置来访问元素。
3.map和vector都可以使用下标来访问元素,但是map不要求关键字为数字。
4.vector按顺序存入的元素,遍历时也是顺序的,但是map不是。vector允许重复的元素出现,map不允许重复的关键字
11.2
list,适用于频繁在头尾之外其他位置进行增加和删除场景
vector,适用于频繁在尾部插入和删除元素,需要快速访问元素的场景
deque,适用于需要在头部和尾部快速插入元素,需要快速访问的场景
map,适用于快速检索,比如字典,通过一个关键字快速访问其值
set,适用于快速检索,比如检查一个元素是否在集合中。
11.3
map<string, size_t> words;
set<string> ingore_set = {"the","an","a","of",",","from","and"};
string word;
while (cin>>word) {
if (ingore_set.find(word)==ingore_set.end()) {
++words[word];
}
}
for (const auto& item:words) {
cout << item.first << " :" << item.second << endl;
}
11.4
为了防止忘记了之前学到的东西,所以这里使用了ostringstream,当做复习一下。
思路就是,在把word当做关键字时,放入detect中检测一遍,消除标点符号,转化为小写。
注意:程序没有做判错处理。
string detect(const string& str,const set<char> & ingore) {
//string temp_str = "";
std::ostringstream output_str("");
for (const auto & item:str) {
if (ingore.find(item) == ingore.end()) {
output_str << static_cast<char>(tolower(item));
}
}
output_str.flush();
return output_str.str();
}
map<string, size_t> words;
set<string> ingore_word_set = {"the","an","a","of","from","and"};
set<char> ingore_char_set = {',','.',';'};
string word;
while (cin>>word) {
if (ingore_word_set.find(word)== ingore_word_set.end()) {
word = detect(word,ingore_char_set);
++words[word];
}
}
for (const auto& item:words) {
cout << item.first << " :" << item.second << endl;
}