我已经使用了很长时间的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中的成员资格测试简单有效,或者你总是要迭代一些有序的序列?
答案 0 :(得分:2)
您在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;
}
实际上,如果您的数据集很小,线性搜索可能仍然是更快的选择。
答案 1 :(得分:2)
了解C ++标准模板库。 set
类(以及其他类)有一个find()
方法,如果它存在,它将向集合中的项返回迭代器。
答案 2 :(得分:2)
查看STL提供的容器及其性能特征。
答案 3 :(得分:1)
Python的方法不是“效率更高”,因为你不知道in
构造的复杂性。
在C ++中,有许多存储数据的方法。二叉树最适合搜索。
如果您使用2,3,4之类的数字,您可以考虑使用一系列bool,并查看是否array[4] == true
答案 4 :(得分:1)
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";
}
答案 5 :(得分:1)
std::find
可以确定任何无序容器或序列中是否存在元素。如果序列是无序的并且没有存储在专为查找而设计的专用容器中,那么你不可能做得比O(N)
更好。