C++中的关联容器(一)

时间: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;
}




  


C++中的关联容器(一),布布扣,bubuko.com

C++中的关联容器(一)

上一篇:二十、异常处理


下一篇:最佳75个安全工具介绍及其下载地址