Единственный способ найти дубликаты - вставить и проверить std::pair.second
для false
, но проблема в том, что это все еще вставляет что-то, если ключ не используется, тогда как я хочу, чтобы map.contains(key);
.
Как проверить, содержит ли std:: map ключ без вставки?
Ответ 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;
}
}