Я пытаюсь проверить, есть ли данный ключ на карте и почему-то не могу это сделать:
typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here
так как я могу распечатать то, что в р?
c++
dictionary
stl
Мы ничего не можем сделать
источник
источник
std::pair<iterator,bool> insert( const value_type& value );
Что за бул возвращается? это говорит, если ключ уже присутствует или нет?Ответы:
использование
map::find
источник
map::count
count
возвращаетint
времяfind
возвращает целый итератор. Вы сохраняете конструкцию итератора :) Очевидно, что если впоследствии вы собираетесь использовать значение, если оно существует, используйте find и сохраните его результат.count
иfind
почти идентичны по скорости при использовании карт, требующих уникальных ключей. (1) Если вам не нужны элементы для поддержания определенного порядка, используйте std :: unordered_map , который имеет почти постоянный поиск и может быть очень полезен при хранении нескольких пар. (2) Если вы хотите использовать значение, если оно существует, сохраните результат :: find и используйте итератор для предотвращения 2-хauto it = m.find("f"); if (it != m.end()) {/*Use it->second*/}
Чтобы проверить, существует ли определенный ключ на карте, используйте
count
функцию-член одним из следующих способов:Документация для
map::find
говорит: «Еще одна функции,map::count
может быть использована только проверить , существует ли конкретный ключ.»Документация для
map::count
говорит: «Поскольку все элементы в контейнере карт являются уникальными, то функция может возвращать только 1 (если элемент найден) или ноль ( в противном случае).»Чтобы извлечь значение из карты через ключ, который, как вы знаете, существует, используйте map :: at :
В отличие от map :: operator [] ,
map::at
не будет создавать новый ключ на карте, если указанный ключ не существует.источник
find
вместо этого.second
Атрибут итератора , возвращенногоfind
можно использовать получить значение ключа. Если вы используетеcount
то,at
илиoperator[]
вы выполняете две операции, когда вы могли бы использовать только одну.if(m.count(key))
int
вbool
. Хотя есть другие компиляторы C ++, которые не выдают подобное предупреждение, я предпочитаю использовать явное сравнение, чтобы прояснить намерение и улучшить читаемость. Обратите внимание, что другие языки, такие как C #, запрещают такое неявное преобразование, чтобы исключить возможность незначительных ошибок программирования.C ++ 20 дает нам
std::map::contains
это сделать.источник
Вы можете использовать
.find()
:источник
Если вы хотите использовать другой API, найдите go
m.count(c)>0
источник
Я думаю, что вы хотите
map::find
. Еслиm.find("f")
равноm.end()
, то ключ не найден. В противном случае find возвращает итератор, указывающий на найденный элемент.Ошибка в том, что
p.first
это итератор, который не работает для вставки потока. Измените свою последнюю строку наcout << (p.first)->first;
.p
является парой итераторов,p.first
является итератором,p.first->first
является ключевой строкой.Карта может иметь только один элемент для данного ключа, поэтому
equal_range
она не очень полезна. Он определен для карты, потому что он определен для всех ассоциативных контейнеров, но гораздо интереснее для мультикарты.источник
C++17
упростил это немного больше сIf statement with initializer
. Таким образом, вы можете получить свой торт и съесть его тоже.источник
проверить ключ существует или нет, и возвращаемое число встречается (0/1 на карте):
проверить ключ существует или нет, и вернуть итератор:
в вашем вопросе, ошибка вызвана плохой
operator<<
перегрузкой, потому чтоp.first
этоmap<string, string>
, вы не можете распечатать его. попробуй это:источник
cout
может означать нечто совсем иное, чемcount
Конечно, если вы хотите стать более любопытным, вы всегда можете шаблонизировать функцию, которая также принимает найденную функцию и не найденную функцию, что-то вроде этого:
И используйте это так:
Недостатком этого является создание хорошего названия, «find_and_execute» неудобно, и я не могу придумать ничего лучшего из головы ...
источник
Будьте внимательны при сравнении результата поиска с концом, как для карты 'm', так как все ответы были сделаны выше map :: iterator i = m.find ("f");
Вы не должны пытаться выполнять какие-либо операции, такие как печать ключа или значения с помощью итератора i, если он равен m.end (), иначе это приведет к ошибке сегментации.
источник
Сравнивая код std :: map :: find и std :: map :: count, я бы сказал, что первое может дать некоторое преимущество в производительности:
источник
Я знаю, что на этот вопрос уже есть несколько хороших ответов, но я думаю, что мое решение стоит поделиться.
Он работает для обоих
std::map
иstd::vector<std::pair<T, U>>
доступен из C ++ 11.источник
Если вы хотите сравнить пару карт, вы можете использовать этот метод:
Это полезная техника.
источник
источник