[英]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.