【问题标题】:How does one test item membership in an unordered sequence (C++)?一个测试项目的成员资格如何以无序序列 (C++)?
【发布时间】:2010-12-20 21:30:29
【问题描述】:

我用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 中的成员资格测试变得简单高效,或者您是否总是需要遍历某个有序序列?

【问题讨论】:

    标签: c++ dictionary map set


    【解决方案1】:

    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;
    }
    

    实际上,如果您的数据集很小,线性搜索可能仍然是更快的选择。

    【讨论】:

      【解决方案2】:

      了解 C++ 标准模板库。 set 类(和其他类)有一个 find() 方法,该方法将返回一个迭代器,指向集合中的某个项目(如果存在)。

      【讨论】:

        【解决方案3】:

        看看STL 提供的容器及其性能特征。

        【讨论】:

          【解决方案4】:

          Python 的方法并不是“效率高得多”,因为您不知道 in 构造的复杂性。

          在 C++ 中有许多存储数据的方法。二叉树最适合搜索。

          如果您使用 2、3、4 等数字,您可以考虑使用布尔数组,并简单地查看 array[4] == true

          【讨论】:

            【解决方案5】:
            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";
            }
            

            【讨论】:

              【解决方案6】:

              std::find 可以确定元素是否存在于任何无序容器或序列中。如果序列是无序的,并且没有存储在为查找而设计的专用容器中,那么您不太可能比O(N) 做得更好。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-03-02
                • 2013-05-31
                • 2018-08-11
                相关资源
                最近更新 更多