- C++
C++map 、unordered_map的区别
- 2024-7-24 23:15:10 @
在C++中,map和unordered_map都是用于存储键值对的数据结构,但它们在内部实现、性能特点以及使用场景上有所不同。
map
内部实现:map是基于红黑树(一种自平衡二叉查找树)实现的。 性能特点:由于红黑树的特性,map中的元素总是按照键的顺序排序。插入、删除和查找操作的时间复杂度通常是O(log n),其中n是map中元素的数量。 使用场景:当你需要有序的数据结构,并且经常进行插入、删除和查找操作时,map是一个很好的选择。
unordered_map 内部实现:unordered_map是基于哈希表实现的。 性能特点:unordered_map不保证元素的顺序。插入、删除和查找操作的时间复杂度通常是O(1),但这取决于哈希函数的质量和哈希冲突的处理方式。在最坏的情况下,时间复杂度可能会退化到O(n)。 使用场景:当你需要一个无序的数据结构,并且希望插入、删除和查找操作尽可能快时,unordered_map是一个更好的选择。
总结
map和unordered_map都用于存储键值对,但它们的内部实现和性能特点不同。 map基于红黑树实现,元素有序,插入、删除和查找操作的时间复杂度是O(log n)。 unordered_map基于哈希表实现,元素无序,插入、删除和查找操作的时间复杂度通常是O(1),但在最坏情况下可能是O(n)。 选择哪种数据结构取决于你的具体需求,包括是否需要有序数据结构以及你对插入、删除和查找操作的性能要求。
map和unordered_map是C++标准模板库(STL)中用于存储键值对(key-value pairs)的两种关联容器。下面分别介绍它们的用法教程。
map的用法教程
- 包含头文件 使用map之前,需要包含头文件。
cpp
#include <map>
- 定义map 可以定义键和值的类型来创建一个map。例如,定义一个键为string类型,值为int类型的map。
cpp
std::map<std::string, int> myMap;
- 插入元素 有几种方法可以插入键值对到map中:
使用insert函数: cpp
myMap.insert(std::make_pair("one", 1));
myMap.insert(std::pair<std::string, int>("two", 2));
使用insert函数和value_type: cpp
myMap.insert(std::map<std::string, int>::value_type("three", 3));
使用下标操作符[](如果键不存在,会创建该键): cpp
myMap["four"] = 4;
- 查找元素 使用find函数查找键,如果找到,返回指向该键值对的迭代器;否则,返回end()迭代器。 cpp
auto it = myMap.find("one");
if (it != myMap.end()) {
std::cout << "Found: " << it->first << " => " << it->second << std::endl;
}
使用count函数,由于map中的键是唯一的,所以返回值只能是0或1。 cpp
if (myMap.count("one") > 0) {
std::cout << "Key exists." << std::endl;
}
- 遍历map 可以使用迭代器遍历map中的所有元素。
cpp
for (const auto& pair : myMap) {
std::cout << pair.first << " => " << pair.second << std::endl;
}
- 删除元素 使用erase函数和迭代器删除元素: cpp
auto it = myMap.find("two");
if (it != myMap.end()) {
myMap.erase(it);
}
直接使用键删除元素: cpp
size_t n = myMap.erase("three"); // 返回删除的元素数量
unordered_map的用法教程
- 包含头文件 使用unordered_map之前,需要包含头文件<unordered_map>。
cpp
#include <unordered_map>
- 定义unordered_map 与map类似,可以定义键和值的类型来创建一个unordered_map。
cpp
std::unordered_map<std::string, int> myUnorderedMap;
- 插入元素 插入元素的方法与map类似,但unordered_map不支持通过下标操作符插入不存在的键(这样做会创建一个新的键值对)。
使用insert函数: cpp
myUnorderedMap.insert(std::make_pair("apple", 5));
myUnorderedMap.insert(std::unordered_map<std::string, int>::value_type("banana", 6));
C++11及以后版本可以使用emplace或try_emplace来优化插入操作。 4. 查找元素 查找元素的方法与map相同,使用find函数或count函数。
cpp
auto it = myUnorderedMap.find("apple");
if (it != myUnorderedMap.end()) {
std::cout << "Found: " << it->first << " => " << it->second << std::endl;
}
if (myUnorderedMap.count("banana") > 0) {
std::cout << "Key exists." << std::endl;
}
- 遍历unordered_map 遍历unordered_map的方法与map相同,使用迭代器或基于范围的for循环。
cpp
for (const auto& pair : myUnorderedMap) {
std::cout << pair.first << " => " << pair.second << std::endl;
}
- 删除元素 删除元素的方法也与map相同,使用erase函数。
cpp
auto it = myUnorderedMap.find("apple");
if (it != myUnorderedMap.end()) {
myUnorderedMap.erase(it);
}
size_t n = myUnorderedMap.erase("banana"); // 返回删除的元素数量
总结 map和unordered_map在用法上有很多相似之处,但它们的内部实现和性能特点不同。选择哪种数据结构取决于具体的应用场景和性能要求。map适用于需要有序遍历的场景,而unordered_map适用于需要快速查找、插入和删除操作的场景。