Проверьте, существует ли элемент в карте c ++ - PullRequest
0 голосов
/ 19 мая 2018

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

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Используйте std::find_if с лямбдой:

map<int,int> m;
m[1] = 10;
m[2] = 20;
m[3] = 30;
auto target = 20;
auto f20 = std::find_if(std::begin(m), std::end(m), [&](const auto& p) {
    return p.second == target;
});
if (f20 != std::end(m)) {
    // We have our value
}

Демонстрация.

Обратите внимание, что в отличие от поиска ключей, который является логарифмическим, поиск по значениямлинейно.

0 голосов
/ 19 мая 2018

Сканирование исходного словаря значений ключей требует O(n) времени и может быть медленным.

Чтобы быстро найти конкретное значение и его ключ, можно создать обратный словарь.Исходное значение std::map для значения ключа, обратный словарь составляет std::unordered_multimap для значения ключа.Время поиска составляет O(1).

0 голосов
/ 19 мая 2018

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

Если вы ищете look_for, вы можете использовать стандартную библиотеку std::find_if:

auto it = std::find_if(map.begin(),
                       map.end(),
                       [&look_for](const auto& kv_pair) {
                            return kv_pair.second == look_for;
                       });
if (it != map.end()) {
    auto key = it->first;
    // ...
} else {
    // Value not found
    // ...
}

Также можно использовать ручной цикл (std::find_if часто считается более хорошим, но здесь это может быть излишним)

for (const auto& kv_pair : map)
    if (kv_pair.second == look_for)
        return kv_pair.first;
// If you reach this, the value isn't in your map
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...