Единственный способ, который я нашел для проверки на наличие дубликатов, - это вставка и проверка std::pair.second
for false
, но проблема в том, что он по-прежнему вставляет что-то, если ключ не используется, тогда как мне нужна map.contains(key);
функция.
148
Ответы:
Использование
my_map.count( key )
; он может возвращать только 0 или 1, что, по сути, является желаемым логическим результатом.Поочередно
my_map.find( key ) != my_map.end()
работает тоже.источник
map::count
реализован какfind(__x) == end() ? 0 : 1;
. Дляmultimap
вас может быть аргумент производительности, но это не вопрос OP, и я все еще предпочитаю элегантность.has(k)
/contains(k)
как и любой другой класс вменяемых карт на планете. Плохой дизайн интерфейса. Подход find () слишком многословен, и этотcount(k)
подход явно не соответствует семантическому равенствуhas(k)
. В этом отношении ни один не являетсяfind(k)
. Проверьте количество просмотров по этому вопросу.Potatoswatter ответ хорошо, но я предпочитаю использовать
find
илиlower_bound
вместо.lower_bound
Это особенно полезно, потому что возвращенный итератор может впоследствии использоваться для подсказки, если вы хотите вставить что-то с тем же ключом.источник
value
могут быть пропущены, если вставка не нужна.lower_bound
решение на основе является излишним. Я только что упомянул свой ответ "для полноты"; Как я уже сказал, ваш вполне адекватен. :-)insert
априори. На самом деле, есть еще одно различие , если с помощьюmultimap
, тоlower_bound
метод вставки в начале эквивалентного диапазона , тогда как обычныйinsert
метод добавляет к концу диапазона.Ваше пожелание
map.contains(key)
запланировано для проекта стандарта C ++ 2a . В 2017 году он был реализован GCC 9.2 . Это также в текущем лязге .источник