c++ STL 容器之 map

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

这篇文章主要对比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");

}





### C++ Ordered Map 使用说明 在 C++ 中,`std::map` 是一种关联容器,默认情况下会按照键的升序存储元素对 (key-value pairs),因此也被称为有序映射 (ordered map)[^1]。 #### 创建和初始化 `std::map` 可以创建不同类型的 `std::map` 并对其进行初始化: ```cpp #include <iostream> #include <map> int main() { std::map<int, int> myMap; // 插入元素 myMap.insert(std::make_pair(1, 2)); myMap.emplace(3, 4); // 初始化列表方式 std::map<std::string, double> anotherMap = {{"pi", 3.14}, {"e", 2.7}}; } ``` #### 访问元素 通过下标运算符或成员函数访问已存在的键对应的值;如果使用下标操作不存在的键,则会在映射中自动插入新条目并赋予默认初始值。 ```cpp // 下标访问 myMap[5]; if(myMap.find(key) != myMap.end()){ value_type val = (*it).second; } auto it = myMap.find("some_key"); if(it != myMap.end()) { std::cout << "Value: " << it->second << '\n'; } else { std::cout << "Key not found\n"; } ``` #### 遍历 `std::map` 遍历整个集合可以通过迭代器完成,也可以利用基于范围的for循环来简化语法糖。 ```cpp // 迭代器遍历 for(auto& elem : myMap){ std::cout << elem.first << ": " << elem.second << "\n"; } // 范围基for循环 for(const auto& [key,value] : myMap){ std::cout << key << "->" << value << "\n"; } ``` #### 删除元素 删除单个指定键所对应的数据项或者清除全部数据项。 ```cpp // 单个移除 size_t erased_count = myMap.erase(some_key); // 清空所有项目 myMap.clear(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值