为什么我们需要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 :: search需要转发iters
- 2. 的std :: condition_variable为什么它需要一个std ::互斥
- 3. 为什么std :: fstream类不需要std :: string?
- 4. 为什么需要
- 5. 用于std :: minmax_element的Step/Stride Iterator
- 6. 为什么std :: sort()需要静态比较函数?
- 7. 为什么需要用std :: string :: operator +()显式调用Myclass :: operator string()?
- 8. 为什么begin()在std :: vector中需要擦除?
- 9. 为什么我需要在临时dynamic_bitset上调用std :: move?
- 10. 为什么不需要使用“新”来初始化std :: vector?
- 11. 清除std :: vector需要赋值运算符。为什么?
- 12. 为什么需要typedef GLXContext?
- 13. 为什么Apache需要SSLCertificateKeyFile?
- 14. 为什么android需要jvm
- 15. 为什么BizTalk需要MSDTC?
- 16. 为什么需要StaticResource?
- 17. 为什么wcf duplex需要?
- 18. 为什么需要EndExecuteNonQuery()?
- 19. Bootstrap为什么需要jQuery?
- 20. 为什么PhotoCamera需要VideoBrush?
- 21. 为什么Grails需要Xerces?
- 22. 为什么需要session_ destroy()?
- 23. 为什么HttpClient需要httpasyncclient?
- 24. 为什么需要copy_to/from_user?
- 25. 为什么需要ReaderLock?
- 26. 为什么我需要MEX?
- 27. 为什么需要load_ptr_acquire?
- 28. 为什么active_support需要sinatra
- 29. 为什么lsyncd需要xnu?
- 30. 为什么需要Control.Invoke?
还要注意'std :: minmax_element'找到_last_最大的元素,而'std :: max_element'找到_first_最大的元素。 [来源](http://en.cppreference.com/w/cpp/algorithm/minmax_element) –
是的。 O(n)有点贵。保存一个遍历看起来值得。 –
@ Konrad'Zegis'很高兴知道,谢谢。 – Quentin