C++ Primer 第十一章 11.1 使用关联容器 练习和总结

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;
	}
发布了54 篇原创文章 · 获赞 6 · 访问量 3314

猜你喜欢

转载自blog.csdn.net/zengqi12138/article/details/104359053