[英]How does one test item membership in an unordered sequence (C++)?
我已经使用python很长时间了,而我才刚刚开始使用C ++
在python中,如果有一个集合或一个字典,则使用in关键字相对容易地获得一个布尔值,该布尔值指示特定项目是否在该序列中 。 即
a = set(2,4,3)
if 4 in a
print "yes, 4 is in a, thank you for asking!"
比这样做要有效得多:
a = [2,3,4]
for number in a
>if number == 4
>>return "yes, 4 is in a, thank you for asking!"
有没有一种方法可以使cpp中的成员资格测试变得简单而高效,还是您总是必须遍历某些有序序列?
您在std :: set和tr1 :: unordered_set中具有类似的功能(在C ++标准中尚未提供)。
#include <set>
#include <cstdio>
int main() {
std::set<int> s;
s.insert(1);
s.insert(2);
s.insert(4);
if (s.find(4) != s.end())
puts("4 found!");
return 0;
}
实际上,如果您的数据集很小,则线性搜索可能仍然是更快的选择。
了解C ++标准模板库。 set
类(和其他set
)具有find()
方法,该方法将向集合中的项目返回迭代器(如果存在)。
看一下STL提供的容器及其性能特征。
Python的方法并不是“效率更高”,因为您不知道in
构造的复杂性。
在C ++中,有许多存储数据的方法。 二叉树最适合搜索。
如果使用2、3、4等数字,则可以考虑使用布尔数组,并简单地看一下array[4] == true
template<typename T>
bool contains(const std::set<T>& a, const T& value) {
return a.find(value) != a.end();
}
if (contains(a, 4)) {
std::cout << "A contains 4\n";
}
std::find
可以确定元素是否存在于任何无序容器或序列中。 如果序列是无序的,并且没有存储在专门用于查找的专用容器中,那么您做的任何事情都不会比O(N)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.