Поиск значения в unordered_map

Я использую Boost unordered_map. У меня есть пара ключевых значений для каждой записи. Как я могу определить, существует ли конкретное значение на карте? (Я не хочу создавать еще один unordered_map, который сохранил значение как ключ и ключ как значение)

Спасибо.

Ответ 1

Как насчет следующего:

typedef std::unordered_map<int,std::string> map_type;
typedef std::unordered_map<int,std::string>::value_type map_value_type;

map_type m;

if (m.end() != find_if(m.begin(),m.end(),[](const map_value_type& vt)
                                           { return vt.second == "abc"; }
                                           ))
   std::cout << "Value found." << std::end;
else
   std::cout << "Value NOT found." << std::end;

Или используя захваченную внешнюю переменную:

std::string value = "abc";
if (m.end() != find_if(m.begin(),m.end(),[&value](const map_value_type& vt)
                                                 { return vt.second == value; }))
   std::cout << "Value found." << std::end;
else
   std::cout << "Value NOT found." << std::end;

Ответ 2

Boost имеет Bimap, который представляет собой двунаправленную карту (т.е. ключи и значения относятся друг к другу). Это звучит более подходящим для ваших нужд, чем unordered_map.

Ответ 3

Вам нужно перебрать все элементы в unordered_map и посмотреть, существует ли данное значение.

Для упрощения этого метода можно использовать алгоритм std::find_if с пользовательским предикатом.

Ответ 4

Почему мы не можем использовать метод count вместо find()

Описание: Считать элементы с помощью определенного ключа Ищет контейнер для элементов с ключом k и возвращает количество найденных элементов. Поскольку контейнеры unordered_map не позволяют дублировать ключи, это означает, что функция фактически возвращает 1, если в контейнере существует элемент с этим ключом, а в противном случае - нуль.

unordered_map<int, int> hash;
    //converted array into hashMap
    for(int i=0; i<6; i++)
    {
        hash[i];
    }

    //commom elemenest value is set to 1 in hashMap
    for(int i =0; i<7; i++)
    {
        //element exist in array1
        if(hash.count(i))
        {
            hash[i] = 1;
        }
    }