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
}
答案 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
,就可以得到最简洁的代码。如果您的设计最终可能允许/需要每个键不同的计数,那么您可以与特定值进行比较。