Как проверить, содержит ли std:: map ключ без вставки?

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

Ответ 1

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

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

Ответ 2

Ответ на 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
}

Ответ 3

Ваше задание, map.contains(key), запланировано для проекта стандарта С++ 2a. В 2017 году он был реализован gcc 9.2. Это также в текущем лязге.

Ответ 4

Я знаю, что на этот вопрос уже есть несколько хороших ответов, но я думаю, что мое решение стоит поделиться.

Он работает как для std::map, так и для std::vector<std::pair<T, U>> и доступен на С++ 11.

template <typename ForwardIterator, typename Key>
bool contains_key(ForwardIterator first, ForwardIterator last, Key const key) {
    using ValueType = typename std::iterator_traits<ForwardIterator>::value_type;

    auto search_result = std::find_if(
        first, last,
        [&key](ValueType const& item) {
            return item.first == key;
        }
    );

    if (search_result == last) {
        return false;
    } else {
        return true;
    }
}