2016-11-18 16 views
2

我們可以在std::set上使用std::find,但它可能會很慢,因爲std::set的成員函數std::set::find通常比std::find更快。是std :: find僅適用於其元素可能未被排序的容器?

std::find僅適用於其元素可能未被排序的容器,例如, std::list

可以std::find阻止用戶使用它來找到std::set上的東西嗎?

+0

*要求*在這裏http://en.cppreference.com/w/cpp/algorithm/find,雖然它不完全清楚你在問什麼。 – juanchopanza

+0

'unoredered_set'和'unordered_map'呢? – juanchopanza

+0

std :: find根本不適合容器,它接收一對迭代器。這些迭代器只需要滿足InputIterator的要求。沒有什麼需要隨機訪問或利用它。 –

回答

2

一般來說,你可以使用的std ::發現所有這些爲您提供輸入迭代容器。 Here是關於std :: info及其迭代器要求的信息。

主要問題是有效性。該算法不知道任何有關它所使用的容器的內部表示。因此std :: find只是迭代特定容器的元素。沒有辦法阻止它處理容器,如std :: set。而且,這與STL的設計相矛盾。

作爲一般規則,您應該將容器方法更改爲具有相同名稱的算法。

2

無論容器如何,在最壞的情況下,std :: find()總是會使用O(n),因爲它下面只做線性迭代搜索,並比較迭代器指向的值。

因此,它無法利用該容器中的元素是否已排序。

而且不,std::find不會阻止用戶找到std::set上的東西。

相關問題