18.了解各种与排序有关的选择
排序算法有如下:
- sort、stable_sort
- partial_sort、無對應的穩定排序算法
- nth_element、無對應的穩定排序算法
- partition、stable_partition
sort、stable_sort、partitial_sort、nth_element算法都要求隨機訪問迭代器,所以這些算法都只能被應用于vector、string、deque和數組。對標準關聯容器中的元素進行排序并沒有實際意義,因為這樣的容器總是使用比較函數來維護內部元素的有效性。list是唯一需要排序卻無法使用這些排序算法的容器,為此,list特別提供了sort成員函數。(有趣的是,list::sort執行的是穩定排序)。
如果希望對一個list進行完全排序,那可以用sort成員函數來做到這一點;但是,如果需要對list中的對象使用partial_sort或者nth_elment算法的話,你就只能通過間接途徑來完成了。
將list中的元素拷貝到一個提供隨機訪問迭代器的容器中,然后對該容器執行你所期待的算法;
先創建一個list::itrator的容器,再對該容器執行相應的算法,然后通過其中的迭代器訪問list的元素。
利用一個包含迭代器的有序容器中的信息,通過返回調用splice成員函數,將list中的元素調整到期望的目標位置。
與sort、statble_sort、partial_sort、nth_element不同的是,partition和stable_partition只要求雙向迭代器技能完成工作。
總結一下:
- 如果需要對vector、string、deque或者數組中的元素執行一次完全排序,可以使用sort、stable_sort。
- 如果有一個vector、string、deque或者數組,并且只需要對等價性最前面的n個元素進行排序,那么可以使用partial_sort。
- 如果有一個vector、string、deque或者數組中,并且需要找到第n個位置上的元素,或者,需要找到等價性最前面的n個元素但又不必對這n個元素進行排序,那么nth_element正是你需要的函數。
- 如果需要將一個標準序列容器中的元素是否滿足某個特定的條件區分開來,那么partition、stable_partition可能正是你需要的。
- 如果你的數據在一個list中,那么你依然可以直接調用partition、stable_partition算法;你可以用list::sort來代器sort和stable_sort算法。但是,如果你需要獲取partial_sort或nth_element算法的效果,那么,正如前面提到的那樣,你可以有一些間接的途徑來完成這項任務。
總的來說,算法所做的工作越多,它需要的時間也越多;穩定的排序算法要比哪些忽略穩定性的算法更為耗時。建議是對排序算法的選擇應該更多地基于你所完成的功能,而不是算法的性能。如果你選擇的算法恰好能完成你所需要的功能,那么多數情況下,這不僅可以使你的代碼更加清晰,而且也是用STL來完成相應功能最有效的途徑。
總結
以上是生活随笔為你收集整理的18.了解各种与排序有关的选择的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 17.容器的成员函数优先于同名的算法
- 下一篇: C++14 新特性