爲什麼我們需要std::min_element
和std::max_element
的組合版本std::minmax_element
?這僅僅是爲了節省比較,還是其他好處?爲什麼需要std :: minmax_element?
4
A
回答
10
std::min_element
和std::max_element
需要在返回之前遍歷整個容器。如果你使用std::min_element
然後std::max_element
那麼這是兩個遍歷,而如果你使用std::minmax_element
那麼你只需要一個。
所以是的,這只是保存比較的「正義」,但我認爲減少檢索所需數據而不損失清晰度所需的工作量是非常值得的。
3
它列出了兩點不同:
這種算法是從
std::make_pair(std::min_element(), std::max_element())
不同,不僅在效率,而且在這個算法找到最後最大的元素,而std::max_element
發現第一最大的元素。
所提到的效率增益,是因爲std::minmax_element
只需要一次處理的數據,而同時運行std::min_element
和std::max_element
需要兩次處理的數據。
+0
這不僅僅是處理一次數據,它還可以通過這種方式執行更少的比較(3n/2而不是2n)。順便說一下,在某些情況下,它比調用min_element和max_element要慢(例如,由於分支預測更差,所以在x86上是int或double隨機順序的數組)。 –
相關問題
- 1. 爲什麼std :: allocator需要propagate_on_container_move_assignment爲true?
- 2. 爲什麼std :: search需要轉發iters
- 3. 爲什麼std :: vector需要operator =
- 4. 爲什麼這個std :: map鍵提取函數需要--std = C++?
- 5. 爲什麼std :: fstream類不需要std :: string?
- 6. 爲什麼std :: generate()和std :: generate_n()需要不同的迭代器?
- 7. 爲什麼我們需要綁定std :: cin和std :: cout?
- 8. 爲什麼需要
- 9. 爲什麼需要「{} \」?
- 10. 用於std :: minmax_element的Step/Stride Iterator
- 11. 爲什麼我需要在臨時dynamic_bitset上調用std :: move?
- 12. 清除std :: vector需要賦值運算符。爲什麼?
- 13. 爲什麼std :: sort()需要靜態比較函數?
- 14. std :: back_inserter在舊的GCC上需要const_reference。爲什麼?
- 15. 爲什麼不需要使用「新」來初始化std :: vector?
- 16. 爲什麼「std :: accumulate」需要顯式重載「operator +」?
- 17. 爲什麼需要雙括號與std :: is_same
- 18. 爲什麼<cmath>函數不需要「使用std :: xxx」?
- 19. 爲什麼std :: remove需要const版本的迭代器?
- 20. 爲什麼std :: sort和partial_sort需要隨機訪問迭代器?
- 21. 爲什麼begin()在std :: vector中需要擦除?
- 22. 爲什麼需要用std :: string :: operator +()顯式調用Myclass :: operator string()?
- 23. 爲什麼這需要一個明確的std :: move?
- 24. 爲什麼要使用std :: async?
- 25. 爲什麼需要copy_to/from_user?
- 26. 爲什麼Grails需要Xerces?
- 27. 爲什麼我需要「&」?
- 28. 爲什麼需要Server.HtmlEncode?
- 29. 爲什麼需要$ = jQuery
- 30. 爲什麼//需要的/
還要注意'std :: minmax_element'找到_last_最大的元素,而'std :: max_element'找到_first_最大的元素。 [來源](http://en.cppreference.com/w/cpp/algorithm/minmax_element) –
是的。 O(n)有點貴。保存一個遍歷看起來值得。 –
@ Konrad'Zegis'很高興知道,謝謝。 – Quentin