作者LPH66 ((short)(-15074))
看板Programming
標題Re: overload operator < 來排序
時間Fri Apr 3 12:19:53 2009
※ 引述《adrianshum (Alien)》之銘言:
: ※ 引述《sorryChen (陳揚和)》之銘言:
: : 感謝學長詳細的解答
: : 但我其實想用現成的sort..
: : 現成的sort好像需要pass-in comparison function. 而且我希望這個comparison
: : function 可以輕易抽換 且是根據外部的資訊輕易抽換..
: : 比如說我有個array存有每個人的名子,
: : 然後一個object存有每個人的數學成績 另一個object有國文成績 ....etc
: : 我想要有個comparison的function pointer
: : 指到數學成績這個object的member function 比較兩個人的數學成績 for example
: : 然後也可以指到國文成績這個object..如果要排國文的話...
: : 我不知道要怎麼寫才能利用外部的資料+comparison function
: : 和現成的sort..而我覺得這一定有人寫過相同的問題...
: : 如果用一個interface 要怎麼用呢..
: 我沒記錯的話, 現有 Std lib 裡有不少都已
: 經有提供你所說的 'comparison function',
: 用來讓沒有提供 < operator 的東西能依一個
: 外來傳入的 less function 來作比較 (及 sort)
: 可以去看看 map 怎樣做法. 通常很多情況下都
: 不是真的餵 function pointer, 而是餵 functor
struct object //其實用 class 也不會怎樣 自己控管好 accessibility 就好
{
int x,y,z;
};
bool compare1(const object &a, const object &b)
{
return a.x>b.x;
}
bool compare2(const object &a, const object &b)
{
return a.y<b.y;
}
class compare3 //這是一個functor!
{
public:
bool operator () (const object &a, const object &b)
{
if(a.z==b.z)
{
if(a.y==b.y)
{
return a.x<b.x;
}
else
{
return a.y<b.y;
}
}
else
{
return a.z<b.z;
}
}
};
.....
object data[100];
....
sort(data,data+100,compare1); //把data對x由大排到小
sort(data,data+100,compare2); //把data對y由小排到大
sort(data,data+100,compare3()); //先對z, 一樣再對y, 再一樣對x 都是由小排到大
--
◢ ˊ_▂▃▄▂_ˋ. ◣ ▅▅ ▅▅ ι●╮ █
▄▄▄▄▄
▍
./◤_▂▃▄▂_◥ \'▊ HARUHI █████ <■┘ ▄▄▄▄▄▄▄
▎
⊿ ◤◤◥█◥◥█Δ ISM By-gamejye ¢|\ ▌▌▌▌▌▄▌▌
▏
ζ(▏●‵◥′●▊)Ψ ▏ █
⊿Δ ▄▄▄ ▄▄▄▄
█/|▊ 〃 、 〃▋ |\ ▎ ハルヒ主義 █
▄▄▄█▄▄
◥◥|◣ ‵′ ◢/'◢◢
S.O.S 世界を大いに盛り上げるための涼宮ハルヒの団
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.84
推 sorryChen:太感謝了 這些問題困擾我非常久 128.125.87.33 04/03 14:30
推 sorryChen:可是比較困擾我的是 如何用外部資訊排 128.125.87.33 04/03 14:38
→ sorryChen:不知道怎麼樣把指到外部資訊傳進去 128.125.87.33 04/03 14:40
→ sorryChen:才想說有可能設function pointer 完成 128.125.87.33 04/03 14:41
→ adrianshum:你要傳什麼? functor 有額外資料就行了 202.155.236.82 04/03 15:14
推 march20:把你的 "外部資訊" 放在 object 的定義裡 128.54.20.28 04/04 01:59
推 march20:這樣不就行了? 還是你想做一個 comparator 128.54.20.28 04/04 02:00
推 march20:可以比較全部的東西 ? 128.54.20.28 04/04 02:00
推 sorryChen:好像試成功了 非常感謝前輩的指導 128.125.87.33 04/04 04:18