推 joy0520:好詳細 感謝您!!! 03/01 07:54
「沒有人比Person更了解兩個Person物件該怎麼比較」
比較好的方式是把比較的函式定義為成員函式, 分為靜態和非靜態
兩種, 推文中 littleshan 大提出的實作像是這樣:
class Person
{
private: std::string name;
public: static int compare( Person const &lhs, Person const &rhs )
{
return lhs.name.compare( rhs.name );
}
};
compare 函式回傳出來的結果就和標準庫中 strcmp、memcmp 一樣,
接著你再依照想要的行為, 製作出 Binary Predicate Function:
bool PersonLessThan( Person const &lhs, Person const &rhs )
{
return Person::compare( lhs, rhs ) < 0;
}
然後以下面的形式呼叫 std::sort:
std::sort( people.begin(), people.end(), PersonLessThan );
非靜態的方式定義起來也差不多, 呼叫的時候也只差一點點:
class Person
{
private: std::string name;
public: int compare( Person const &target ) const
{
return name.compare( target.name );
}
};
bool PersonLessThan( Person const &lhs, Person const &rhs )
{
return lhs.compare( rhs ) < 0;
}
我比較偏好這種形式, 因為比較像英文的文法而且主動被動容易分
清楚.
走火入魔的話也可以改用仿函式(Functor/Function Object), 或是
重載各種比較的運算子(參考<utility>裡的rel_ops命名空間),前者
想改變比較準則會輕鬆得多. 用 friend當未來程式一大, 些許更新
要改的檔案會較多, 看你的情況來做選擇囉!
附上 friend 的作法, 跟靜態成員函式差不多
class Person
{
friend bool PersonLessThan( Person const &lhs, Person const &rhs );
private: std::string name;
};
bool PersonLessThan( Person const &lhs, Person const &rhs )
{
return lhs.name < rhs.name;
}
設計上的問題還能幫點忙, 至於語法上的問題你還是要多看一下書喔
! ...Orz
--
◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去
████◤ ██ ◢██◣█ ██ ████ ██ s ~> T-ara
█/███ ██ ██ ██ █/█ ◢███ █/█ 歡迎您的光臨
████◤ ██ ██ ██ ██◤ ███◤ ██◤ 恩靜、智妍、孝敏
█/███ ██ █/██◤ ██ █/██ ██ 素妍、居麗、寶藍
████◤ █◤ ◥██◤ █◤ ████◤█◤ 花英 ψmakigoto123
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
※ 編輯: loveme00835 來自: 140.121.197.115 (03/01 02:14)