簡體   English   中英

C ++中的sort()函數

[英]sort() function in C++

我在C ++中找到了兩種形式的sort():

1)排序(開始,結束);

2)XXX.sort();

一個可以在沒有對象的情況下直接使用,一個可以使用對象。

這就是全部? 這兩種排序()之間有什么區別? 他們來自同一個圖書館? 第二個是XXX的方法嗎?

我可以像這樣使用它嗎?

vector<int> myvector
myvector.sort();

要么

list<int> mylist;
mylist.sort();

std::sort是一個函數模板,可以與任何一對隨機訪問迭代器一起使用。 因此,由std::sort實現的算法被定制(優化)用於隨機訪問。 大多數時候它會有一些快速排序的味道。

std::list::sort是一個專用的面向列表的排序版本。 std::list是一個不支持[高效]隨機訪問的容器,這意味着你不能使用std::sort 這產生了對專用排序算法的需求。 大多數情況下,它將被實現為一些合並排序的風格。

std::list包含一個sort()成員,因為有一些方法可以有效地對列表進行排序,但幾乎沒有別的。 如果您嘗試對列表使用相同的排序實現,則其中一個不能很好地工作,因此它們為list提供了一個特殊的list

大多數情況下,你應該使用std::sort ,並忘記std::list甚至存在。 它在一些非常具體的情況下是有用的,但它們是非常罕見的,使用它是至少有90%的時間人們認為它應該是錯誤的。

編輯:情況不是使用std::list::sort是一個錯誤,但使用std::list通常是一個錯誤。 這有幾個原因。 首先,除了存儲每個項目的空間之外, std::list需要幾個指針,因此除非您的數據相當大,否則會占用大量空間。 其次,由於每個節點都是單獨分配的,因此遍歷節點往往相當慢(引用的位置較低,因此緩存利用率往往較差)。 最后,雖然您可以從列表中間插入或刪除具有常量復雜性的元素,但您(通常)需要使用列表的線性復雜性遍歷來找到插入或刪除該項的正確點。 結合緩存利用率較低的情況 ,在鏈表中間進行插入和刪除通常比使用vector或deque之類的速度慢

另外10%的時間(或者可能稍微少於一點)是你可以長期合理地在列表中存儲一個位置,並且(至少通常)計划在(靠近)進行多次插入和刪除)同一點,每次都沒有遍歷鏈表,找到合適的地方。 如果您在同一位置(或接近)對列表進行了足夠的修改,則可以通過多次插入和刪除來分攤列表遍歷。 如果你在同一個地方(接近)做了足夠的修改,你可以提前出來。

在少數情況下,這可以很好地解決,但會迫使您長期存儲更多“狀態”數據,主要是為了彌補數據結構本身的不足。 在可能的范圍內,我更傾向於使單個操作接近純粹和原子,因此它們最小化對長期數據的依賴性(和影響)。 在單線程情況下,這主要有助於模塊化,但是對於多核,多線程(等)編程,它還可以對效率和開發難度產生實質性影響。 訪問該長期數據通常需要線程同步。

這並不是說避免列表會自動使你的程序更快,或類似的東西 - 只是我發現非常罕見的情況非常有用,並且很多情況似乎適合人們被告知的事情當鏈表有用時,實際上並非如此。

std::sort僅適用於隨機訪問迭代器。 這將它限制為數組,向量和雙端隊列(以及提供隨機訪問的用戶定義類型)。

std::list是一個不支持隨機訪問的鏈表。 通用排序功能不適用於它。 即使它確實如此,也不是最理想的。 鏈接列表不是通過從節點復制數據來排序的 - 它通過重新鏈接節點進行排序。

std::sort也不適用於其他容器(集合和映射),但總是對它們進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM