目录
我也从没想过STL中的set还有这么多的花样。总而言之,如果你觉得这篇文章还不错,劳烦多多支持一下!码字不易,感谢你的观看!
前言
这个栏目是对我算法学习过程的同步记录,我也希望能够通过这个专栏加深自己对编程的理解以及帮助到更多像我一样想从零学习算法并参加竞赛的同学。在这个专栏的文章中我会结合在编程过程中遇到的各种问题并提出相应的解决方案。当然,如果屏幕前的你有更好的想法或者发现的错误也欢迎交流和指出!不喜勿喷!不喜勿喷!不喜勿喷!这章的内容比较重要!那么事不宜迟,我们马上开始吧!
一、map
1.简要介绍
map是一种关联容器,用于存储一对键值对(key-value pairs),其中每个键(key)都是唯一的。map容器根据键自动排序,并且可以通过键来快速查找值。map容器使用红黑树(Red-Black Tree)数据结构来实现,具有较快的插入、删除和查找速度。
以下是映射的示意图(这里以ASCII码表为例):
2.map的定义和结构
map的定义和结构如下所示:
template <class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key, T>>>
(1)Key:表示存储在map中的键(Key)的类型。
(2)T:表示存储在map中的值(Value)的类型。
(3)Compare:表示用比较键的函数类型,默认为less,使用键类型的默认比较函数
(4)Allocator:表示用于分配内存的分配器类型,默认为allocator。
3.map的常用函数表
map的常用函数表如下所示:
函数 | 功能 | 时间复杂度 |
---|---|---|
insert | 插入元素 | O(logn) |
erase(key) | 删除元素 | O(logn) |
find(key) | 查找元素 | O(logn) |
count(key) | 统计元素个数 | O(logn) |
size | 返回元素个数 | O(1) |
begin | 返回指向容器起始位置的迭代器 | O(1) |
end | 返回指向容器末尾位置的迭代器 | O(1) |
clear | 清空容器 | O(1) |
empty | 判断容器是否为空 | O(1) |
lower_bound | 返回第一个不小于指定键的元素位置 | O(logn) |
upper_bound | 返回第一个大于指定键的元素位置 | O(logn) |
二、multimap
1.基本介绍
multimap是一种关联容器,类似于map但允许存储多个具有相同键的键值对。在实际做题中,我们几乎不会使用这一类型。感兴趣的同学可以自行了解,这里不再赘述。
三、unordered_map
1.基本介绍
unordered_map是一种关联容器。与map类似,其中每个键都是唯一的。但是特殊的是其不会按照剪的顺序进行排序,而是使用哈希函数将键映射到存储桶中。因此unordered_map具有更优秀的插入、删除和查找操作的平均时间复杂度,但不保证元素的顺序。unordered_map具有极好的平均时间复杂度和极差的最坏时间复杂度,一般情况下我们会更加愿意使用复杂度稳定的map而非unordered_map。
四、代码示例
1.map
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
map<int, string> map1 = { {1,"Apple"},{2,"Banana"},{3,"Orange"} };
//插入元素
map1.insert(make_pair(4, "Grapes"));
//查找和访问元素
cout << "Value at Key2: " << map1[2] << "\n";
//遍历并打印map中的元素
for (const auto& pair : map1) {
cout << "Key: " << pair.first << ", Value: " << pair.second << "\n";
}
//删除元素
map1.erase(3);
//判断元素是否存在
if (map1.count(3) == 0)cout << "Key3 not found." << "\n";
//清空map
map1.clear();
//判断map是否为空
if (map1.empty())cout << "map1 is empty." << "\n";
return 0;
}
输出结果为:
Value at Key2: Banana
Key: 1, Value: Apple
Key: 2, Value: Banana
Key: 3, Value: Orange
Key: 4, Value: Grapes
Key3 not found.
map1 is empty.
2.multimap
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
multimap<int, string> map1 = { {1,"Apple"},{2,"Banana"},{2,"Orange"} };
//插入元素
map1.insert(make_pair(4, "Grapes"));
//查找和访问元素
auto range = map1.equal_range(2);
for (auto it = range.first; it != range.second; ++it) {
cout << "Key: " << it->first << ", Value: " << it->second << "\n";
}
//遍历并打印map中的元素
for (const auto& pair : map1) {
cout << "Key: " << pair.first << ", Value: " << pair.second << "\n";
}
//删除元素
map1.erase(2);
//判断元素是否存在
if (map1.count(2) == 0)cout << "Key2 not found." << "\n";
//清空map
map1.clear();
//判断map是否为空
if (map1.empty())cout << "map1 is empty." << "\n";
return 0;
}
输出结果为:
Key: 2, Value: Banana
Key: 2, Value: Orange
Key: 1, Value: Apple
Key: 2, Value: Banana
Key: 2, Value: Orange
Key: 4, Value: Grapes
Key2 not found.
map1 is empty.
3.unordered_map
代码如下:
#include <bits/stdc++.h>
#include <unordered_map>
using namespace std;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
unordered_map<string, int> map1 = { {"Apple",3},{"Banana",5},{"Orange",2}};
//插入元素
map1.insert(make_pair("Grapes",4));
//查找和访问元素
cout << "Value for key 'Banana': " << map1["Banana"] << "\n";
//遍历并打印map中的元素
for (const auto& pair : map1) {
cout << "Key: " << pair.first << ", Value: " << pair.second << "\n";
}
//删除元素
map1.erase("Orange");
//判断元素是否存在
if (map1.count("Orange") == 0)cout << "Key'Orange' not found." << "\n";
//清空map
map1.clear();
//判断map是否为空
if (map1.empty())cout << "map1 is empty." << "\n";
return 0;
}
输出结果为:
Value for key 'Banana': 5
Key: Apple, Value: 3
Key: Banana, Value: 5
Key: Orange, Value: 2
Key: Grapes, Value: 4
Key'Orange' not found.
map1 is empty.