How to check if std::map contains a key without doing insert?
The only way I have found to check for duplicates is by inserting and checking the std::pair.second for false , but the problem is that this still inserts something if the key is unused, whereas what I want is a map.contains(key); function.
3 Answers 3
Use my_map.count( key ) ; it can only return 0 or 1, which is essentially the Boolean result you want.
Alternately my_map.find( key ) != my_map.end() works too.
Potatoswatter’s answer is all right, but I prefer to use find or lower_bound instead. lower_bound is especially useful because the iterator returned can subsequently be used for a hinted insertion, should you wish to insert something with the same key.
Проверка существования ключа в карте на C++
В этой статье будет рассказано, как проверить, существует ли ключ на карте в C++.
Использование функции std::map::find для проверки существования ключа в карте на C++
Контейнер std::map представляет собой ассоциативную структуру данных пар ключ-значение, хранящихся отсортированными, и каждый элемент имеет уникальный ключ. С другой стороны, STL также предоставляет несортированную версию того же контейнера с именем std::unordered_map . Оба этих контейнера поддерживают ключевые методы поиска, описанные ниже.
find — одна из встроенных функций контейнера std::map , которая принимает единственный аргумент соответствующего значения ключа для поиска. Функция возвращает итератор элементу с заданным значением ключа, в противном случае — итератор, прошедший за конец. В следующем примере мы инициализируем map типов std::pair<string, string> , а затем берем значение ключа из пользовательского ввода, переданного в функцию find . Программа-пример выводит утвердительную строку в поток cout .
Использование функции std::map::count для проверки наличия ключа в карте C++
В качестве альтернативы можно использовать встроенную функцию count контейнера std::map , чтобы проверить, существует ли данный ключ в объекте карты. Обратите внимание, что функция count извлекает количество элементов, имеющих заданное значение ключа. Если не найдено ни одного элемента с ключом, возвращается значение 0 . Таким образом, мы можем использовать вызов функции count как условие if для вывода подтверждающей строки, когда данный ключ существует в объекте карты.
Использование функции std::map::contains для проверки существования ключа в карте C++
contains — еще одна встроенная функция, которая может использоваться, чтобы определить, существует ли ключ в map . Эта функция возвращает логическое значение, если элемент с данным ключом существует в объекте. Обратите внимание, что все три функции, перечисленные в этой статье, имеют логарифмическую сложность.
Проверьте, существует ли ключ на карте в Java
В этом посте будет обсуждаться, как проверить, существует ли данный ключ на карте в Java. Решение должно проверять, содержит ли карта сопоставление для ключа k такой, что Objects.equals(key, k) выполняется для данного ключа key .
1. Использование containsKey() метод
The containsKey() метод возвращает true, если эта карта содержит сопоставление для указанного ключа. Вы можете использовать его следующим образом:
Обратите внимание, что если класс не переопределяет equals() а также hashCode() методы, и если объект такого класса вставлен в Карту в качестве ключа, containsKey() метод вернет false. Чтобы исправить это, перегрузить методы equals и hashCode. Также обратите внимание, что containsKey() броски метода NullPointerException если указанный ключ имеет значение null, а реализация карты не разрешает использование нулевых ключей.
Небольшие, но важные функции
Начиная с C++20 в несколько стандартных контейнеров, включая std::map , std::set и std::string , были добавлены некоторые очень полезные функции для поиска. Необходимость в них существовала уже в течении достаточно долгого времени, и мне приятно видеть, что комитет наконец признал их важность. Надеюсь, это только начало серии замечательных дополнений.
Map и set
Типовая операция при работе с map — проверить, существует ли конкретный ключ. Как это сделать в C++17? Все просто:
Хотя это может быть достаточно просто, это отнюдь совсем не удобно для пользователя. По этой причине многие пишут свою собственную функцию contains() , которая принимает map и ключ и возвращает логическое значение, указывающее, содержит ли map ключ. В C++20 это больше не нужно, т.к. std::map имеет родной метод contains() .
То же верно и для std::set
Даже больше, в C++20 функция contains() была добавлена к целому ряду типов:
Строки
Похожая проблема актуальна и для строк. Иногда нам нужно узнать, содержит ли строка другую строку. Вот как это делается в C++17:
Частный случай, связанный со строками, — это поиск подстроки в начале и в конце строки. Поиск в начале относительно прост:
Но для поиска в конце требуется вспомогательная функция. Возможная реализация такова:
Что можно использовать следующим образом:
(Примечание: Вы можете найти альтернативные реализации этой функции здесь)
C++20 значительно упростил ситуацию, где std::basic_string и std::basic_string_view получили два новых метода: starts_with() и ends_with()
Однако в C++20 есть достаточно большое упущение: функция для проверки того, содержит ли строка подстроку. Во время последнего заседания комитета ISO C++, такой метод был добавлен в C++23 (P1679). Это позволит нам написать следующее:
Именно так мы всегда и хотели писать код.
Вы должны помнить, что эти новые строковые функции чувствительны к регистру. Они не принимают предикат, позволяющий настроить способ выполнения поиска. Следовательно, если вам нужно выполнить поиск без учета регистра, вам все равно нужно будет реализовать это самостоятельно. Возможные реализации contains() , startwith() и endwith() , которые выполняют поиск без учета регистра, показаны ниже: