拥有来自C#的C ++模拟ContainsKey(TKey) - 什么是最好的实践?

时间:2017-08-03 13:40:24

标签: c++ c++11 stl containers

C ++模拟IDictionary.ContainsKey(TKey)或C#中的List.Contains(T)?

例如我有元素数组,需要知道这个数组有没有值? 什么是最好的方法或最好的实践 - 没有每个元素的“foreach”! 例如,如果它来自std库将会很好。

UPD 1 :在std lib中有很多容器,但我想找到一种最好的方法 - 更快,更少的代码,更简单的等等......

如果继续this logic

,那么更好的设计std::unordered_set
    #include <unordered_set>

    std::unordered_set<std::string> NamesOfValues = { 
    "one", 
    "two", 
    "Date",
    "Time" 
    };

  // and now check is value exists in set
  if(NamesOfValues.count(value))
    {
        // value exists
    }

2 个答案:

答案 0 :(得分:2)

您正在寻找std::find。查找查找任意类型的任意类型输入并返回该元素的迭代器。

例如,要在字典中查找元素,您可以执行以下操作:

std::unordered_map<char,int> my_map = { {'a', 1},{'b', 2}};

auto found_element = std::find(my_map.begin(), my_map.end(), 'a');
if( found_element == my_map.end() ){
   //nothing was found
}
else{
   // do something
}

对于标准地图,您还可以使用map.find(T)进行O(1)访问,而不是O(n)。

if( my_map.find('a') != my_map.end() ){
   //something was found!
}
else{
   //nothing was found
}

这比my_map.count()更清楚......如果您实际上想要弄清楚您拥有多少元素以及您是否使用非唯一键,那么您只会使用它。

答案 1 :(得分:2)

使用count似乎最简洁,这适用于任何容器。

if ( my_map.count(key) ) { // shorthand for `count(key) != 0`
    // It exists
} else {
    // It does not
}

如果我们讨论的是最接近原始字典类型的[unordered_]map[unordered_]set,则这些容器会强制执行唯一键,因此返回的.count()只能是{{ 1}}或0,没有必要担心代码一旦找到匹配就无意义地迭代容器的其余部分(就像支持重复的容器一样)

无论哪种方式,只需使用隐式转换到1,就可以得到最简洁的代码。如果您的设计最终可能允许/需要每个键不同的计数,那么您可以与特定值进行比较。