2009-01-20 23 views
3

我正在使用一個集合,因爲我想使用排序容器(如集合)的快速查找屬性。我想知道是否必須使用find成員方法來獲得已排序的容器的好處,還是我也可以在STL算法中使用靜態查找方法?在STL集上使用靜態與成員查找方法?

我的預感是,使用靜態版本將使用線性搜索,而不是像我想要的二進制搜索。

回答

8

你是對的,non-member version做線性搜索,而成員版本將做O(log N)搜索。 std :: set針對O(log N)插入,檢索和刪除進行了優化。

作爲定義的一點,std :: find方法不是一個靜態函數。在這裏看到的關於the various things static的描述可以用C++來表示。

2

這是依賴於實現的,因爲某些人可能已經對在集上使用二進制搜索的靜態「查找」實施了部分特化,但是考慮到所有因素,成員函數版本可能會表現得更好。

IIRC,Scott Meyers在其着作「有效STL」中建議,始終更喜歡通過非成員函數尋找,交換等通用函數的成員版本,因爲它們更有可能成爲最優實現非會員版本您通常可以依賴成員版本的性能優勢,而不能總是依賴於給定函數的部分特化將出現的事實。

+0

+1提到部分專業化。 – deworde 2012-12-20 11:44:34