c++ STL 容器之 map

本文对比了 C++ STL 中 map、multimap、unordered_map 和 unordered_multimap 的使用场景和特点,阐述了如何根据 key 值是否有序及是否允许重复来选择合适的容器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章主要对比map, multimap, unordered map和unordered multimap.

当我们发现某两个数据之间成对存在,并彼此关联,就可以用map这种容器来存放这对数据,根据是否需要元素有序,和key值是否可以重复来选择不同的容器。

如果需要储存的元素是有序的,就要选择map,如果不需要元素有序,就可以选择onordered_map。 使用map的时候,通过key值访问元素会比使用unordered_map要慢。

Map:

1. Map中的元素通过键值对组织在一起,也就是说可以通过key来找到与其对应的元素。

2. Map中的元素要按照一定的顺序排列起来,即便是新插入的元素,也要根据这个顺序给它合适的位置。

3. Map中任意两个元素不能享有同一个key值。

4. Map是用二叉搜索数实现的。

Unordered_map:

1. Unordered_map中的元素通过键值对组织在一起,也就是说可以通过key来找到与其对应的元素。

2. Unordered_map中的元素不需要按照一定的顺序排列,插入的顺序就是元素在unordered_map里的顺序。

3. Unordered_map中任意两个元素不能享有同一个key值。

4. Unordered_map是用hash table组织元素结构的。

总结:通过讨论元素是否有序(通过key值排序)选择map或者unoredered_map.

以上是当key值不能重复的时候的情况,如果可以允许两个或者两个以上的元素使用同一个key值,map和unordered_map就不好使了。这种情况下可以使用multimap,multimap允许两个或者两个以上元素享用同一个key值,然后在根据元素是否需要被排序来选择multimap或者unordered_multimap;

需要注意的是,multimap和map享用同一个头文件,unordered_map和unordered_multimap享用同一个头文件。

#include
using namespace std;
#include
#include
int main() {
	map hash;
	multimap hash1;
	unordered_map hash_unordered;
	unordered_multimap hash_unordered1;
	hash.insert(pair(4, 2));
	hash.insert(pair(3, 2));
	hash.insert(pair(3, 3));
	hash.insert(pair(2, 3));
	
	hash1.insert(pair(4, 2));
	hash1.insert(pair(3, 2));
	hash1.insert(pair(3, 3));
	hash1.insert(pair(2, 3));


	hash_unordered.insert(pair(4, 2));
	hash_unordered.insert(pair(3, 2));
	hash_unordered.insert(pair(3, 3));
	hash_unordered.insert(pair(2, 3));

	hash_unordered1.insert(pair(4, 2));
	hash_unordered1.insert(pair(3, 2));
	hash_unordered1.insert(pair(3, 3));
	hash_unordered1.insert(pair(2, 3));
	cout <<  "map:"  << endl;
	map::iterator it;
	for (it = hash.begin(); it != hash.end(); it++) {
		cout << it->first<<":" <second<< endl;
	}
	cout << "multi map:" << endl;
	multimap::iterator it1;
	for (it = hash1.begin(); it != hash1.end(); it++) {
		cout << it->first << ":" << it->second << endl;
	}
	cout << "unordered_map:" << endl;
	unordered_map::iterator it2;
	for (it2 = hash_unordered.begin(); it2 != hash_unordered.end(); it2++) {
		cout << it2->first << ":" << it2->second << endl;
	}
	cout << "unordered_multi map:" << endl;
	unordered_multimap::iterator it3;
	for (it3 = hash_unordered1.begin(); it3 != hash_unordered1.end(); it3++) {
		cout << it3->first << ":" << it3->second << endl;
	}
	system("pause");

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值