※ 引述《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.