【C++】STL—— unordered
文章目录
- 1. unordered_map的介绍
- 2. unordered_map的使用
- 2.1unordered_map的构造函数
- 2.2unordered_map的迭代器
- 2.3unordered_map的容量和访问函数
- 2.4unordered_map的增删查改函数
1. unordered_map的介绍
unordered_map的介绍
(1)unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。
(2)在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
(3)在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
(4)unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭代方面效率较低。
(5)unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问value。
(6)它的迭代器至少是前向迭代器。
unordered_map和map的区别:
(1)底层实现:map内部使用红黑树(一种自平衡二叉查找树)来实现,而unordered_map则使用哈希表来实现。因此,在map中,元素是按照键的大小进行有序排列的,而在unordered_map中,则不保证元素的顺序。
(2)性能表现:当需要有序地遍历元素时,map的性能比unordered_map更好。 但是,当需要快速查找特定的元素时,unordered_map通常比map更快。原因在于,map在插入和删除操作时需要维护红黑树的平衡,而unordered_map则只需要计算哈希值并将元素放入相应的桶中即可。
(3)用途:由于map可以保证元素的有序性,所以适合用于需要有序的情况下,例如按照键排序输出元素、寻找最小值/最大值等。而unordered_map则适合用于需要快速查找元素的情况下,例如查找是否存在某个键值对、统计某个值出现的次数等。
2. unordered_map的使用
2.1unordered_map的构造函数
以下是几个unordered_map构造函数的例子:
(1)默认构造函数:
unordered_map mymap;
(2)使用n个元素构造unordered_map:
unordered_map mymap = {{1, "one"}, {2, "two"}, {3, "three"}};
(3)使用给定的范围构造unordered_map:
vector myVector = {{1, "one"}, {2, "two"}, {3, "three"}}; unordered_map mymap(myVector.begin(), myVector.end());
(4)使用给定的哈希函数和相等比较函数构造unordered_map:
struct myHashFunction { size_t operator()(const int& key) const { return hash()(key); } }; struct myEqualFunction { bool operator()(const int& key1, const int& key2) const { return key1 == key2; } }; unordered_map mymap;
2.2unordered_map的迭代器
函数声明 功能介绍 begin 返回unordered_map第一个元素的迭代器 end 返回unordered_map最后一个元素下一个位置的迭代器 cbegin 返回unordered_map第一个元素的const迭代器 cend 返回unordered_map最后一个元素下一个位置的const迭代器 以下是使用unordered_map迭代器的示例:
(1)使用迭代器遍历unordered_map,从begin()到end()。在循环中,使用it->first和it->second分别访问键和值。
#include #include int main() { std::unordered_map mymap = {{1, "one"}, {2, "two"}, {3, "three"}}; // 使用迭代器遍历unordered_map for (auto it = mymap.begin(); it != mymap.end(); ++it) { std::cout std::unordered_map{1, "one"}, {2, "two"}, {3, "three"}}; // 使用范围for循环遍历unordered_map for (const auto& pair : mymap) { std::cout std::unordered_map std::cout std::cout {1, "one"}, {2, "two"}, {3, "three"}}; if (myMap.empty()) { std::cout std::cout std::unordered_map{1, "one"}, {2, "two"}, {3, "three"}}; std::cout std::unordered_map // 键存在于unordered_map中 std::cout // 键不存在于unordered_map中 std::cout std::cout std::cout "key", "value"}); if (result.second) { // 插入成功 std::cout // 插入失败(键已存在) std::cout my_map.erase(it); std::cout std::cout std::cout std::cout