2017-08-03 141 views
1

在C++中有模拟IDictionary.ContainsKey(TKey)或List.Contains(T)吗?C++模拟ContainsKey(TKey)来自C# - 最好的实践是什么?

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

UPD 1:在标准库有很多容器,但我想找到一个最好的方式 - 更快,少的代码,那么复杂,等等...

Lookind是更好desigionstd::unordered_set如果this logic

#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 
    } 
+1

可以看看std :: map(特别是 - find()函数):http://www.cplusplus.com/reference/map/map/find/ –

+0

可能吧,我看看 - 但可能有更好的指示 - 例如std :: map :: count看起来更好... – Alexander

+0

[确定映射是否包含某个键的值?]的可能重复(https://stackoverflow.com/questions/3136520 /确定,如果地图,包含一个值为一个键) –

回答

3

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

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

如果我们谈论[unordered_]map[unordered_]set,这是最接近原始的字典类型,那么这些容器强制执行的唯一密钥,所以返回的.count()只能是01,而且也没有必要担心关于代码无意义地迭代容器的其余部分(就像容器支持重复项一样)

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

+0

如果(my_map.count(key)> 0)可能会更好? – Alexander

+1

我不明白为什么。 'map'和'set'都不能包含给定键的多于一个的元素。所以结果可能是0或1.为什么复杂的事情?但是,如果你更喜欢写''0'的语义,那么一定要随意。我想这可能会让代码更容易转移到其他类型的容器中。 –

+0

噢 - 是的, - 你是对的! – Alexander

3

去你正在寻找std::find。 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

几乎 - 但这给了一个“大代码”,我正在寻找简短和更好的指示。 – Alexander

+0

@Alexander你是什么意思的“大代码”,我现在也包括一个例子。据我所知,没有其他标准的方法可以做到这一点 – snb

+0

@Alexander你可以用布尔函数把这样的代码包装起来,然后传递参数。这样你就可以拥有类似.containsKey(...)返回true或false –