如何在无序序列(C ++)中测试项目成员资格?

时间:2010-12-20 21:30:30

标签: c++ dictionary map set

我已经使用了很长时间的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中的成员资格测试简单有效,或者你总是要迭代一些有序的序列?

6 个答案:

答案 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)更好。