Получить первое значение (строку) в карте из второго значения (int) - PullRequest
0 голосов
/ 14 мая 2019

Если у вас есть std :: map, которая принимает строку и int.

    std::map<std::string, int> exampleMap;

Есть ли способ напечатать строку, если у вас есть правильный int?

Допустим, я вставил строку "привет" и int 0 в мою карту:

    exampleMap.insert(std::make_pair("hello", 0));

Для печати 0 мы можем использовать:

    exampleMap.find('hello')->second;

Есть ли способ напечатать строку "привет"?

Ответы [ 3 ]

2 голосов
/ 14 мая 2019

Вы можете последовательно просматривать все записи на карте, пока не найдете одну со значением:

for (auto &it : exampleMap)
{
    if (it.second == value)
        return it.first;
}

Хотя вам нужно решить, что делать, если есть несколько записей с одинаковым значением int, а также что делать, если int не найден.

1 голос
/ 14 мая 2019

У вас есть несколько вариантов ...

  1. Создание двух карт (одна идет от строки к int, а другая - к другой)
  2. Вы можете использовать "двунаправленную" карту , которая позволит вам идти обоими путями. Boost также имеет реализацию .
  3. Вы можете использовать функцию, подобную этой , чтобы конвертировать из одной карты в другую.

Какой из них вы выберете, зависит от того, как часто вам нужно выполнять оба поиска. Если это редко, я бы использовал функцию преобразования. Если это не редкость, я бы использовал двунаправленный контейнер.

1 голос
/ 14 мая 2019

Допустим, я вставил строку "привет" и int 0 в мою карту:

 exampleMap.insert(std::make_pair("hello", 0));

Есть ли способ напечатать строку "привет"?

вам нужно выполнить итерацию, чтобы найти записи с ожидаемым значением для печати ключа

#include <map>
#include <string>
#include <iostream>

int main()
{
  std::map<std::string, int> exampleMap;

  exampleMap.insert(std::make_pair("hello", 0));
  exampleMap.insert(std::make_pair("how", 1));
  exampleMap.insert(std::make_pair("are", 2));
  exampleMap.insert(std::make_pair("you", 0));

  int expected = 0;

  for (std::map<std::string, int>::const_iterator it = exampleMap.begin();
       it != exampleMap.end();
       ++it) {
    if (it->second == expected)
      std::cout << it->first << std::endl;
  }
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra m.cc
pi@raspberrypi:/tmp $ ./a.out
hello
you
pi@raspberrypi:/tmp $ 
...