How to find whether an element exists in std::map?

后端 未结 11 2155
醉梦人生
醉梦人生 2020-12-07 23:55

My use case:

map cars;
bool exists(const string& name) {
  // somehow I should find whether my MAP has a car
  // with the name provid         


        
相关标签:
11条回答
  • 2020-12-08 00:32

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

    It returns map::end if the item doesn't exist.

    0 讨论(0)
  • 2020-12-08 00:35
    bool exists(const std::map<std::string, Car>& cars, const std::string& name) {
      return cars.end() != cars.find(name);
    }
    
    0 讨论(0)
  • 2020-12-08 00:38

    What about:

    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();
    }
    

    This makes exists_in work with any standard container via std::find and use a special version for std::map since it offers a more efficient searching alternative. You could add additional specializations as necessary (e.g., for std::set and others).

    0 讨论(0)
  • 2020-12-08 00:39
    bool exists(const string& name)
    {
        return cars.find(name) != cars.end();
    }
    
    0 讨论(0)
  • 2020-12-08 00:40

    Apart from the answers with iterator-Value from find() and comparison to .end(), there is another way: map::count.

    You can call map::count(key) with a specific key; it will return how many entries exist for the given key. For maps with unique keys, the result will be either 0 or 1. Since multimap exists as well with the same interface, better compare with != 0 for existence to be on the safe side.

    for your example, that's

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

    The advantages I see are 1. shorter code, 2. benefit from whatever optimisations the library may apply internally, using its representation details.

    0 讨论(0)
  • 2020-12-08 00:41
    #define itertype(v) typeof((v).begin())
    itertype(cars) it = cars.find(name);
    return it != cars.end();
    
    0 讨论(0)
提交回复
热议问题