關於stable_sort()和sort()的區別:
你發現有sort和stable_sort,還有 partition 和stable_partition, 感到奇怪吧。其中的區別是,帶有stable的函式可保證相等元素的原本相對次序在排序後保持不變。或許你會問,既然相等,你還管他相對位置呢,也分不清 楚誰是誰了?這裡需要弄清楚一個問題,這裡的相等,是指你提供的函式表示兩個元素相等,並不一定是一摸一樣的元素。
例如,如果你寫一個比較函式:
bool less_len(const string &str1, const string &str2)
{
return str1.length() < str2.length();
}
此時,"apples" 和 "winter" 就是相等的,如果在"apples" 出現在"winter"前面,用帶stable的函式排序後,他們的次序一定不變,如果你使用的是不帶"stable"的函式排序,那麼排序完 後,"winter"有可能在"apples"的前面。
舉例說明:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
bool comp_as_int(double i, double j)
{
return (int(i)<int(j));
}
int main()
{
double mydoubles[] = { 3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58 };
vector<double> v;
vector<double>::iterator it;
v.assign(mydoubles, mydoubles + 8);
cout << "use default comparison:" << endl;
stable_sort(v.begin(), v.end());
for (it = v.begin(); it != v.end(); it++)
cout << *it << " ";
cout << endl;
cout << "use selfdefined comparison function comp_as_int():" << endl;
v.assign(mydoubles, mydoubles + 8);
//stable sort 是穩定排序。
stable_sort(v.begin(), v.end(), comp_as_int);
for (it = v.begin(); it != v.end(); it++)
cout << *it << " ";
cout << endl;
cout << "use comparison function comp_as_int():" << endl;
v.assign(mydoubles, mydoubles + 8);
//sort是不穩定排序。
sort(v.begin(), v.end(), comp_as_int);
for (it = v.begin(); it != v.end(); it++)
cout << *it << " ";
cout << endl;
cout << "if it is not sorted with stable_sort(), the sequence of all elements between 1 and 2 will be set randomly..." << endl;
int n;
cin >> n;
return 0;
}
相關文章
- 關於gcc、make和CMake的區別GC
- hive中order by、distribute by、sort by和cluster by的區別和聯絡Hive
- 關於java的引用和c++的區別JavaC++
- 關於PHP this 和 self 呼叫類方法的區別PHP
- 關於Ajax和websocket的區別以及使用場景!Web
- 關於CATALINA_HOME 和 CATALINA_BASE 的區別
- 關於Vue和React區別的一些筆記VueReact筆記
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- postgresql關於postgresql.auto.conf和postgresql.conf的區別SQL
- nginx關於root與alias的區別Nginx
- 關於C與C++的區別C++
- Android關於buildToolVersion與CompileSdkVersion的區別AndroidUICompile
- 關於Ae和Pr的的區別,你瞭解對了嗎?
- 12C關於CDB、PDB引數的區別和總結
- Vuejs中關於computed、methods、watch的區別VueJS
- Cookie 和 Session 關係和區別CookieSession
- WebGL和OpenGL的區別及關係Web
- 滑鼠CPI和DPI是什麼?關於滑鼠DPI和CPI的區別詳解
- http中session和cookie的區別和關係HTTPSessionCookie
- 關於機器學習和AI的區別最經典的解釋機器學習AI
- rust trait 關聯型別和泛型的區別RustAI型別泛型
- out關鍵字和ref關鍵字的區別
- HashTable、ConcurrentHashMap、TreeMap、HashMap關於鍵值的區別HashMap
- 關於js陣列方法sort()負數排序的陷阱JS陣列排序
- Python 關於TCP簡介以及與UDP的區別PythonTCPUDP
- ../和./和/的區別
- 關於mysql中欄位定義的型別int、tinyint區別MySql型別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- 關於物件導向和麵向過程本質的區別(個人感悟)物件
- CDB和PDB關於使用者建立和使用者許可權區別
- know和know about的區別 基於coca corpus
- ||和??的區別
- /*和/**的區別
- Linux作業系統關於ftp,samba,nfs的區別Linux作業系統FTPSambaNFS
- [20180917]關於分析函式的range與rows的區別.txt函式
- [ASP.NET]關於DOT NET的IIS配置LocalHost訪問和127.0.0.1訪問的區別ASP.NETlocalhost127.0.0.1
- 關於Java和C#的型別對比JavaC#型別