2013-06-22 71 views
2

的優點在容器的find方法中使用C++ 11的std::find有什麼好處嗎?std :: find

  • std::vector的情況下(其不具有find方法)不會std::find使用一些智能算法或簡單地每個元素遍歷幼稚方式嗎?

  • std::map看來你需要沿着std::pair,這是一個std::mapvalue_type通過的情況。這通常不像通常想要爲鍵或映射元素找到的那樣非常有用。

  • 其他容器如std::liststd::setstd::unordered_set

+1

你可以在'std :: map'上使用'std :: find_if'來只比較密鑰。但在這種情況下,最好使用'find'成員函數,因爲性能。但是,如果出於某種原因,您想通過值來搜索地圖,那麼可以在這種情況下使用'find_if'。 –

+3

如果存在,則使用成員函數,如果不存在,則使用'std :: find'。 –

+0

如果你知道你的std :: vector實際上是排序的,那麼總是有使用std :: lower_bound()做二分搜索的選項。 – Adam

回答

8

性病::向量的情況下(不具有find方法)沒有標準::發現使用一些智能算法或乾脆每一個元素遍歷用簡單的方式?

它不能,因爲矢量沒有排序。除了具有O(n)複雜度的線性搜索,沒有其他方式可以在未排序的向量中找到元素。

另一方面,順序容器不提供find()成員函數,所以你不可能使用它。

在std :: map的情況下,似乎你需要傳遞一個std :: pair,它是std :: map的value_type。這通常不像通常想要爲鍵或映射元素找到的那樣非常有用。

的確,在這裏你應該使用find()成員函數,它保證了更好的複雜性(O(logN))。

通常情況下,當一個容器公開一個與通用算法同名的成員函數時,這是因爲成員函數做同樣的事情,但提供了更好的複雜性保證。

其他容器如std :: list或std :: set或std :: unordered_set怎麼樣?

就像std::vectorstd::list不是一個排序容器 - 這樣的結論也可適用。

對於std::setstd::unordered_set,相反,你應該使用find()成員函數,這保證了較好的複雜度(O(log n)的平均O(1),分別)。

相關問題