Как проверить, содержит ли std :: map ключ без вставки? - PullRequest
135 голосов
/ 08 октября 2010

Единственный способ найти дубликаты, который я нашел, - это вставить и проверить std::pair.second для false, но проблема в том, что он все равно вставляет что-то, если ключ не используется, тогда как мне нужен map.contains(key); функция.

Ответы [ 2 ]

281 голосов
/ 08 октября 2010

Использование my_map.count( key );он может возвращать только 0 или 1, что по сути является желаемым логическим результатом.

Альтернативно my_map.find( key ) != my_map.end() тоже работает.

46 голосов
/ 08 октября 2010

Ответ Potatoswatter в порядке, но я предпочитаю использовать find или lower_bound.lower_bound особенно полезен, потому что возвращенный итератор может впоследствии использоваться для подсказки, если вы хотите вставить что-то с тем же ключом.

map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) {    // not found
    // ...
    my_map.insert(iter, make_pair(key, value));     // hinted insertion
} else {
    // ... use iter->second here
}
...