你發現有sort和stable_sort,還有 partition 和stable_partition, 感到奇怪吧。其中的區別是,帶有stable的函數可保證相等元素的原本相對次序在排序后保持不變。或許你會問,既然相等,你還管他相對位置呢,也分不清 楚誰是誰了?這里需要弄清楚一個問題,這里的相等,是指你提供的函數表示兩個元素相等,并不一定是一摸一樣的元素。
例如,如果你寫一個比較函數:
bool less_len(const string &str1, const string &str2){ return str1.length() < str2.length();}此時,"apple" 和 "winter" 就是相等的,如果在"apple" 出現在"winter"前面,用帶stable的函數排序后,他們的次序一定不變,如果你使用的是不帶"stable"的函數排序,那么排序完 后,"Winter"有可能在"apple"的前面。
舉例說明:
#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;}
新聞熱點
疑難解答