精華區beta C_and_CPP 關於我們 聯絡資訊
※ 引述《DeanL (word spectrum)》之銘言: : 在<algorithm>中的 void sort(RanIt first, RanIt last, Pret pt) : 其中Pret要給什麼?看online help似乎不得其門而入.... : 另外,這是可以sort所有的container嗎? : sort map看起來怪怪的.... @_@ DeanL 是看 vs6.0 上的 MSDN 的吧 由以下我所轉錄的內容來看 (沒有實證過,如有錯誤,期有他人能加以改正) algorithm (or algo.h) 中的 generic algorithm , sort 只對那些 iterator 為 random access 的作用 (像 list 這 container 就不行,故 list 有其特有的 sort function) 又你上文所提的 pt 我們可以想成是 c library 中 qsort 的 comparison function 只不過在這 pt 是以 function object 取代之。 (即內定的 sort 是做由小至大的sort,且只支援 c 原有的 type 加上為 擁有 random access iterator 的 container,故此參數可做為我們用來 1. 改變 sort 的方式 2. 使 sort 能支援我們所新增的 container) Prototype Sort is an overloaded name; there are actually two sort functions. template <class RandomAccessIterator> void sort(RandomAccessIterator first, RandomAccessIterator last); template <class RandomAccessIterator, class StrictWeakOrdering> void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp); Description Sort sorts the elements in [first, last) into ascending order, meaning that if i and j are any two valid iterators in [first, last) such that i precedes j, then *j is not less than *i. Note: sort is not guaranteed to be stable. That is, suppose that *i and *j are equivalent: neither one is less than the other. It is not guaranteed that the relative order of these two elements will be preserved by sort. [1] The two versions of sort differ in how they define whether one element is less than another. The first version compares objects using operator<, and the second compares objects using a function object comp. 龍龍 -- 你是一位聰明人嗎?如果是,你該記住,你的聰明是跟那些人學來的, 然後在適當的地點,適當的時間,輕輕的對那人說:這是你教我的。 聲音要輕,而且只告訴他一個人。 摘錄自"牧羊少年奇幻之旅" -- ※ 發信站: 批踢踢實業坊(ptt.twbbs.org) ◆ From: DickG.m5.ntu.ed > -------------------------------------------------------------------------- < 作者: hotball (哲哲魚) 看板: C_and_CPP 標題: Re: [問題] STL中的sort 時間: Fri Jan 8 20:15:24 1999 因為前面的例子舉得不好(基本上是錯的,for_each 不能這樣用) 所以在這裡再舉另一個例子(從 The C++ Programming Language 3rd edition 中 偷來的): 假這你想要寫一個函式 f,可以把一個 list 裡面的東西全部加起來,求其總和, 可以這樣寫: template<class T> class Sum { T res; public: Sum(T i = 0) : res(i) { } operator()(T x) { res += x; } T result() const { return res; } }; void f(list<double>& ld) { Sum<double> s; for_each(ld.begin(), ld.end(), s); cout << "the sum is " << s.result() << '\n'; } Sum 就是一個 function object,在 for_each 裡面會對 ld.begin() 到 ld.end() 之間的每一個 object 都 call s.operator()。 Function object 還有另一個用途。例如,使用 find_if 函式來找東西時,如果 想找 < 7 的數字,可以寫一個函式: list<int> v; bool less_than_7(int n) { return n < 7; } 然後 call find_if(v.begin(), v.end(), less_than_7); 可是如果想要找 < k 的數字,而 k 是在 run-time 才能決定的(例如,使用者 輸入的),那這招就行不通了。這時,可以用 function object: template<class T> struct less_than_k : public unary_function<T, bool> { const T s; public: explicit less_than_k(const T& k) : s(k) { } bool operator()(const T& n) const { return n < s; } }; 然後再 call find_if(v.begin(), v.end(), less_than_k(k)); 就可以找到 < k 的數字了。 -- ※ 發信站: 批踢踢實業坊(ptt.twbbs.org) ◆ From: kimicat.m1.ntu.