Используйте map :: find
if ( m.find("f") == m.end() ) {
// not found
} else {
// found
}
Я знаю, что этот вопрос уже имеет некоторые хорошие ответы, но я думаю, что моим решением является ценность совместного использования.
Это работает и на std::map
и на std::vector<std::pair<T, U>>
и доступно от C++ 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;
}
}
m.find == m.end() // not found
Если вы хотите использовать другой API, найдите go for m.count (c)> 0
if (m.count("f")>0)
cout << " is an element of m.\n";
else
cout << " is not an element of m.\n";
Вы можете использовать .find ()
:
map<string,string>::iterator i = m.find("f");
if (i == m.end()) { /* Not found */ }
else { /* Found, i->first is f, i->second is ++-- */ }
Думаю, вам нужен map :: find
. Если m.find ("f")
равно m.end ()
, то ключ не найден. В противном случае find возвращает итератор, указывающий на найденный элемент.
Ошибка связана с тем, что p.first
является итератором, который не работает для вставки потока. Измените последнюю строку на cout << (p.first) -> first;
. p
- пара итераторов, p.first
- итератор, p.first-> first
- строка ключа.
Карта может только когда-либо иметь один элемент для данного ключа, поэтому equal_range
не очень полезно. Он определен для карты, потому что он определен для всех ассоциативных контейнеров, но гораздо интереснее для мульти-карты.