📅  最后修改于: 2023-12-03 15:23:34.238000             🧑  作者: Mango
在 C++ 中,无序映射是一个非常有用和强大的数据结构。它允许我们将键和值配对存储,并具有 O(1) 的插入、查找和删除复杂度(平均情况下)。但是,当我们需要遍历无序映射时,需要一些特殊的技巧。本文将介绍如何在 C++ 中迭代无序映射。
在 C++ 中,迭代器是一种非常有用的数据结构,它允许我们在容器中遍历元素。对于无序映射,我们可以使用 unordered_map::iterator
或 unordered_map::const_iterator
来遍历映射中的键/值对。
#include <unordered_map>
std::unordered_map<int, std::string> my_map = {
{1, "apple"},
{2, "banana"},
{3, "cherry"},
{4, "date"}
};
for(auto it = my_map.begin(); it != my_map.end(); ++it) {
std::cout << it->first << " : " << it->second << std::endl;
}
上面的代码将输出:
1 : apple
2 : banana
3 : cherry
4 : date
可以看到,我们使用 unordered_map::iterator
来遍历映射中的键/值对。it
是一个指向键/值对的迭代器,我们可以使用 it->first
来访问键,it->second
来访问值。
需要注意的是,在 C++11 中,我们可以使用范围 for
循环来遍历无序映射,如下所示:
for(const auto& kv : my_map) {
std::cout << kv.first << " : " << kv.second << std::endl;
}
上面的代码与之前的代码等效,输出相同。
如果我们只是需要遍历无序映射的键/值对,并且不需要修改它们,那么我们应该使用 const 迭代器。这样可以确保我们不会意外地修改映射中的内容。
for(std::unordered_map<int, std::string>::const_iterator it = my_map.cbegin(); it != my_map.cend(); ++it) {
std::cout << it->first << " : " << it->second << std::endl;
}
在上面的代码中,我们使用 unordered_map::const_iterator
来定义 const 迭代器。需要注意的是,在 C++11 中,我们可以使用 auto
来自动推断迭代器类型。
在 C++17 中,我们可以使用 std::unordered_map::operator[]
函数来遍历无序映射中的值,如下所示:
for(const auto& kv : my_map) {
std::cout << my_map[kv.first] << std::endl;
}
上面的代码将输出:
apple
banana
cherry
date
这里,我们使用迭代器 kv
来访问映射中的键和值。然后,我们使用 my_map[kv.first]
来访问相应的值。
值得注意的是,这种方法只适用于无序映射的值,并且会在访问不存在的键时创建一个默认值。
无序映射是 C++ 中非常有用和强大的数据结构,但是在遍历它们时需要注意一些细节。本文介绍了遍历无序映射的几种方法,包括迭代器和 C++17 中的新函数。希望这篇文章能够帮助你更好地理解和使用无序映射。