📜  在映射无序映射c ++中迭代(1)

📅  最后修改于: 2023-12-03 15:23:34.238000             🧑  作者: Mango

在 C++ 中迭代无序映射

在 C++ 中,无序映射是一个非常有用和强大的数据结构。它允许我们将键和值配对存储,并具有 O(1) 的插入、查找和删除复杂度(平均情况下)。但是,当我们需要遍历无序映射时,需要一些特殊的技巧。本文将介绍如何在 C++ 中迭代无序映射。

迭代器

在 C++ 中,迭代器是一种非常有用的数据结构,它允许我们在容器中遍历元素。对于无序映射,我们可以使用 unordered_map::iteratorunordered_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 迭代器

如果我们只是需要遍历无序映射的键/值对,并且不需要修改它们,那么我们应该使用 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 变化

在 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 中的新函数。希望这篇文章能够帮助你更好地理解和使用无序映射。