2012-11-09 64 views
3

我有std::set其中包含來自int的值。現在我使用迭代器來確定set是否爲value。用g當++編譯在沒有迭代器C++的std :: set中搜索

敵不過

std::set<int> fdsockets; 

void myfunc(int fd) 
{ 
    if(fdsockets[fd] != fdsockets.end()) 
    { 
      // my code 
    } 
} 

但我有錯誤:

但我的應用程序中使用這個搜索很ofter並使用迭代太慢搜索,我可以做這樣的事情'運營商[]'在'fdsockets [fd]'

也許我可以用東西,而不是std::set

謝謝!

+1

http://en.cppreference。 com/w/cpp/container/set/find –

+0

在find集上的循環中使用'find()'的原因是find()是O(log(N))算法。一個循環比O(N)更糟糕(我懷疑它是一個O(N * log(N))算法),因爲對於那些關聯容器,'operator ++()'相當複雜。 –

+0

std :: set有一個find()方法,它是O(log(n)) –

回答

4

std::unorered_set或有序的vector二進制搜索更簡單的會員測試更有效。如果整數的最大值很低,查找表可能是另一種選擇。

+2

如果你很少從向量中添加或移除元素,那麼使用二分查找排序的'vector'只會更有效。每次插入或刪除都需要時間。但搜索速度會更快。 – Yakk

+0

你說得對。二進制搜索或靜態表僅適用於靜態數據。 – hansmaad

+0

@Yakk這並不確定。它也取決於數據集的大小。並且複製'int'是一個非常便宜的操作;插入和刪除,甚至在一箇中等大小的數據集中,使用排序的向量比使用「std :: set」可能更便宜:您可以複製大量的數據以獲得一個分配的價格(並且找到插入的位置也更便宜)。 –

2

std :: set中沒有運算符[]。

你大概的意思

if(fdsockets.find(fd) != fdsockets.end()) 
4

這聽起來像你想set::find()

if(fdsockets.find(fd) != fdsockets.end()) 
{ 
     // my code 
} 
0

如果您不需要迭代器,set::find回報(只是測試的存在,實際上並不打算訪問fdsocket),這裏有一個替代方案:

if(fdsockets.count(fd)) 
{ 
     // my code 
}