• 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的用法教程

  1. 包含头文件 使用map之前,需要包含头文件。

cpp

#include <map>
  1. 定义map 可以定义键和值的类型来创建一个map。例如,定义一个键为string类型,值为int类型的map。

cpp

std::map<std::string, int> myMap;
  1. 插入元素 有几种方法可以插入键值对到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;
  1. 查找元素 使用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;  
}
  1. 遍历map 可以使用迭代器遍历map中的所有元素。

cpp

for (const auto& pair : myMap) {  
    std::cout << pair.first << " => " << pair.second << std::endl;  
}
  1. 删除元素 使用erase函数和迭代器删除元素: cpp
auto it = myMap.find("two");  
if (it != myMap.end()) {  
    myMap.erase(it);  
}

直接使用键删除元素: cpp

size_t n = myMap.erase("three"); // 返回删除的元素数量

unordered_map的用法教程

  1. 包含头文件 使用unordered_map之前,需要包含头文件<unordered_map>。

cpp

#include <unordered_map>
  1. 定义unordered_map 与map类似,可以定义键和值的类型来创建一个unordered_map。

cpp

std::unordered_map<std::string, int> myUnorderedMap;
  1. 插入元素 插入元素的方法与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;  
}
  1. 遍历unordered_map 遍历unordered_map的方法与map相同,使用迭代器或基于范围的for循环。

cpp

for (const auto& pair : myUnorderedMap) {  
    std::cout << pair.first << " => " << pair.second << std::endl;  
}
  1. 删除元素 删除元素的方法也与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适用于需要快速查找、插入和删除操作的场景。

0 条评论

目前还没有评论...