在排序之後

罕見

這個章節是幹嘛的

在前面,我們介紹了如何使用 sort() 函式來排序資料。雖然排序這個動作本身就有很多種不同的應用了(尤其是在四、五級範圍內),但是在排序之後,我們還可以進一步進行一些操作,這邊將會介紹一些只有在排序之後才能進行的進階操作!

unique()

unique() 函式是一個非常有趣的函式,它可以將重複的元素「濾掉」,只保留一個。這個函式的使用方式非常簡單,只需要將排序後的容器傳入即可。

vector<int> v = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());

// 結果:v = {1, 2, 3, 4}

merge()

merge() 函式可以將兩個已經排序好的容器合併成一個排序好的容器。這個函式的使用方式也非常簡單,只需要將兩個排序後的容器傳入即可。

vector<int> v1 = {1, 3, 5, 7};

vector<int> v2 = {2, 4, 6, 8};

vector<int> v3(v1.size() + v2.size());

// 結果:v3 = {1, 2, 3, 4, 5, 6, 7, 8}
補充

你也許會想說為什麼不把兩個陣列合併後再排序一次呢?這是因為 merge() 的時間複雜度是 O(n)O(n),而排序的時間複雜度是 O(nlogn)O(n \log n),所以如果你已經知道兩個陣列都是排序好的,那麼使用 merge() 會比較快。

簡單來說就是,如果你知道兩個陣列都是排序好的,那麼使用 merge() 會比較快。

時間複雜度的部分在未來的章節會有更詳細的介紹,不過你可以先記住這個觀念。

小測驗

下列哪個函式必須在排序之後才能使用,否則可能會出現預期之外的結果?