Поиск значения в 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;
}
}