關於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;
}
相關文章
- 關於HashMap和Hashtable的區別HashMap
- 關於sort/hash區域大小的設定
- 關於gcc、make和CMake的區別GC
- 關於java的引用和c++的區別JavaC++
- hive中order by、distribute by、sort by和cluster by的區別和聯絡Hive
- 關於Ajax和websocket的區別以及使用場景!Web
- 關於記憶體中棧和堆的區別記憶體
- 關於CI,ASCS,DI的區別
- 關於sysdba,sysoper,dba的區別
- 關於Vue和React區別的一些筆記VueReact筆記
- 關於機器學習和AI的區別最經典的解釋機器學習AI
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- nginx關於root與alias的區別Nginx
- 關於C與C++的區別C++
- 關於 in與exist , not in與not exist 的區別
- 關於JSF與Struts的區別JS
- 關於企業級應用和web開發的區別Web
- 關於Ae和Pr的的區別,你瞭解對了嗎?
- 對於java中的"\"和"/" 區別Java
- 12C關於CDB、PDB引數的區別和總結
- Cookie 和 Session 關係和區別CookieSession
- WebGL和OpenGL的區別及關係Web
- 滑鼠CPI和DPI是什麼?關於滑鼠DPI和CPI的區別詳解
- http中session和cookie的區別和關係HTTPSessionCookie
- postgresql關於postgresql.auto.conf和postgresql.conf的區別SQL
- 關於CATALINA_HOME 和 CATALINA_BASE 的區別
- 關於oracle10G標準版和企業版的區別Oracle
- out關鍵字和ref關鍵字的區別
- 關於HashSet與TreeSet的區別與聯絡
- 關於String與StringBuffer的區別
- 關於重定向符>>與>的區別與作用
- 關於rman裡面的from 與until的區別
- 水煮oracle33---關於oracle中segment、schema和user區別Oracle
- 關於MySQL與SQLLite的GroupBy排序原理的區別MySql排序
- 關於物件導向和麵向過程本質的區別(個人感悟)物件
- rust trait 關聯型別和泛型的區別RustAI型別泛型
- 關於js陣列方法sort()負數排序的陷阱JS陣列排序
- Android關於buildToolVersion與CompileSdkVersion的區別AndroidUICompile