【问题标题】:Access only one element of a pair in an unordered_map in c++仅访问 C++ 中 unordered_map 中的一对元素
【发布时间】:2020-04-29 20:27:44
【问题描述】:

我试图在 C++ 中获得与 rust 元组解构相同的行为。 例如:我有一个想要迭代的 unordered_map。但是,我关心的唯一数据是值,而不是键。

有没有办法在不使用以下语法的情况下使用 for 循环对其进行迭代? (这是我现在所拥有的)

for (auto &pair : _map)
{
   std::cout << pair.second << std::endl;
}

我想要这样的东西:

for (auto &value : _map)
{
   std::cout << value << std::endl; // This would give me the value and not a pair with key and value.
}

【问题讨论】:

  • .second真的有那么大吗?
  • @tadman 在许多其他语言中,您可以迭代键和值,所以在 c++ 中也可以这样做
  • range-v3 有views::keysviews::values
  • 我明白了,但简短的回答是“处理它”。长的答案是,进行转换以使您的生活更方便是低效的。 C++是用来写快代码的,写代码不一定好玩。其他语言提供了更多便利,例如 Rust,甚至更好的 Ruby,但它们通常以牺牲速度为代价。

标签: c++ loops for-loop unordered-map value-type


【解决方案1】:

如果您的编译器支持 C++ 17 标准,那么您可以编写如下代码

#include <iostream>
#include <unordered_map>
#include <string>

int main() 
{
    std::unordered_map<int, std::string> m =
    {
        { 1, "first" },
        { 2, "second" }
    };

    for ( const auto &[key, value] : m )
    {        
        std::cout << value << ' ';
    }
    std::cout << '\n';

    return 0;
}

程序输出是

second first 

【讨论】:

    【解决方案2】:

    使用 range-v3 库,您可以迭代键:

    for (auto key : m | views::keys)
      // use key
    

    或超过值:

    for (auto value : m | views::values)
      // use value
    

    其中m 可以是map

    在 c++17 中,你可以这样做:

    for ([[maybe_unused]] auto [key, value] : m)
      // use key or value
    

    请注意,[[maybe_unused]] 属性用于抑制有关不使用变量之一的警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      相关资源
      最近更新 更多