Доступ только к одному элементу пары в unordered_map в c ++ - PullRequest
4 голосов
/ 29 апреля 2020

Я пытаюсь получить то же поведение, что и деструктурирование ржавого кортежа в C ++. Например: у меня есть unordered_map, который я хочу перебрать. Тем не менее, единственные данные, которые меня волнуют, это значения, а не ключи.

Есть ли способ выполнить итерацию по нему для l oop без использования следующего синтаксиса? (что у меня сейчас)

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.
}

хорошего дня:)

Ответы [ 2 ]

3 голосов
/ 29 апреля 2020

Если ваш компилятор поддерживает стандарт 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 голосов
/ 29 апреля 2020

Используя библиотеку 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]] используется для подавления предупреждений о том, что не используется одна из переменных.

...