Подтвердить что ты не робот

Как определить, существует ли элемент в std:: map?

Мой прецедент:

map<string, Car> cars;
bool exists(const string& name) {
  // somehow I should find whether my MAP has a car
  // with the name provided
  return false;
} 

Не могли бы вы предложить лучший и самый элегантный способ сделать это на С++? Спасибо.

4b9b3361

Ответ 1

Конечно, используйте итератор

map<string,Car>::const_iterator it = cars.find(name);
return it!=cars.end();

Ответ 2

return cars.find(name) != cars.end();

Ответ 3

Вы также можете использовать

bool exists(const string& name) {
  return cars.count(name) != 0;
} 

Ответ 4

Помимо ответов на итератор-значение из find() и сравнения с .end(), существует другой способ: map:: count.

Вы можете вызвать map:: count (ключ) с определенным ключом; он вернет количество записей для данного ключа. Для карт с уникальными ключами результат будет равен 0 или 1. Так как мультимап существует с одним и тем же интерфейсом, лучше сравните с!= 0 для существования, чтобы быть в безопасности.

для вашего примера, это

return (cars.count(name)>0);

Преимущества, которые я вижу, 1. более короткий код, 2. извлекайте выгоду из любых оптимизаций, которые библиотека может применять внутренне, используя свои данные о представлении.

Ответ 5

Как насчет:

template <typename KeyType, typename Collection>
bool exists_in(Collection const& haystack, KeyType const& needle) {
    return std::find(haystack.begin(), haystack.end(), needle) != haystack.end();
}

template <typename K, typename V>
bool exists_in(std::map<K,V> const& haystack, K const& needle) {
    return haystack.find(needle) != haystack.end();
}

Это делает exists_in работать с любым стандартным контейнером через std::find и использовать специальную версию для std::map, поскольку она предлагает более эффективную альтернативу поиска. Вы можете добавить дополнительные специализации по мере необходимости (например, для std::set и других).

Ответ 6

bool exists(const string& name)
{
    return cars.find(name) != cars.end();
}

Ответ 7

std::map::find(const key_type& x );

Возвращает map::end, если элемент не существует.

Ответ 8

bool exists(const std::map<std::string, Car>& cars, const std::string& name) {
  return cars.end() != cars.find(name);
}

Ответ 9

#define itertype(v) typeof((v).begin())
itertype(cars) it = cars.find(name);
return it != cars.end();