我正在寻找一种在 C++ 17 中迭代映射的键的方法。我现在想到的方法是基于这个问题的答案,该方法如下所示。
for (auto const& [i, val] : myMap)
...
但是,我不需要使用值
val
,我只需要值i
。因此,代码段...
不包含任何对值val
的调用。因此,每当我编译代码时,都会出现以下警告消息:
warning: unused variable ‘val’ [-Wunused-variable]
for (auto const& [i, val] : myMap){
^
我想要的是找到一种方法来迭代(仅)地图的键,忽略值。有人知道该怎么做吗?
两种选择:
@πάνταῥεῖ 的 answer:
的范围版本for (auto const& pair : myMap) {
auto key = pair.first;
// etc. etc.
}
使用 ranges-v3 库(或 C++20 中的
std::ranges
)通过将范围 myMap.begin()
和 myMap.end()
投影到其第一个坐标来调整范围。然后你会写这样的东西:
for (auto key : std::views::keys(myMap)) {
// etc. etc.
}
std::views::keys
。
您可以通过创建一个仅包含键的新容器来在没有范围的情况下完成此操作,但这对于较大的地图来说可能会很昂贵。
(如果您有奇怪的重键,则使用
const auto& key
而不是 auto key
。)
有人知道该怎么做吗?
当然!您可以仅使用带有迭代器的传统
for
循环:
for(auto it = myMap.begin(); it != myMap.end(); ++it) {
auto i = it->first;
// ...
}
您可以通过转换为
void
来避免未使用的警告:
for (auto const& [key, val] : m) {
(void)val; // To avoid unused warnings
// use key
}
如何使用类似 Go 的未使用变量声明与
_
:
for(auto const& [i, _] : myMap)
...
for(自动常量和配对:myMap) 由于映射内部以 std::pair 格式存储元素,因此您可以访问 元素通过写作,pair.first;对于钥匙或配对。第二个;为了价值。
for (auto& [key, std::ignore] : m) {
// use key
}