Re: [語法] STL sort 在一個 Class 裡面含很多priv …

看板C_and_CPP (C/C++)作者 (水無月真夜)時間16年前 (2009/10/05 11:41), 編輯推噓3(3029)
留言32則, 3人參與, 最新討論串2/6 (看更多)
※ 引述《BlackMatrix (BlackMatrix)》之銘言: : 現在我完全改進我的Functor, 變成 : : template <class C> : class LessThanByLat : { : public: : bool operator() (C lhs, C rhs) : { : return (lhs.getLat()<rhs.getLat()); : } : }; : : 跟 : : sort (GNF_vector.begin(), GNF_vector.end(), LessThanByLat<bool>()); : : 我想要我的vector裡面以LAT這個數字以大到小排列, 目前我這樣寫, 看看該怎麼辦 : 成功 : : 如果有想法的拜託請給點提示~~~~ (雖然我知道我上面那串Code寫錯了) : ※ 編輯: BlackMatrix 來自: 71.183.68.195 (10/05 04:55) : : 我解決這個問題了 : : class LessThanByLat : { : public: : bool operator() (GNF& lhs,GNF& rhs) : { : return (lhs.getLat()<rhs.getLat()); : } : }; : : sort (GNF_vector.begin(), GNF_vector.end(), LessThanByLat()); : : 謝謝各位的幫助 教授不是要你用template寫嗎@@ 你這樣寫的話 如果GNF這個class有十個attribute可供排序 你就要寫十個functor.. 所以教授的意思應該是要你用template產生functor 假設 class GNF { int attr1; double attr2; char attr3; public: } 你要做的事有 1. 在GNF裡面加個enum GNF::SortBy,來指出哪些變數可以用來Sort 2. 在GNF的public介面上加一個template member function getAttr<>() 用以提取private,當然你得為每個要提取的變數寫一個特化版本 3. 在GNF外面寫一個template functor 為各種attribute產生functor class GNF { int attr1; double attr2; char attr3; public: enum SortBy { ATTR1, ATTR2, ATTR3}; template<SortBy T> void getAttr() {}; // 主要模板 但是是空的 template<> int getAttr<ATTR1>() { return attr1; }; // 提供特化版本,下略 .... .... } 剩下的template functor的問題就交給你自己想了 如果一切順利 最後的用法應該像這樣 std::sort(GNF_vector.begin(), GNF_vector.end(), LessThanBy<ATTR1> ); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.15.163

10/05 12:04, , 1F
我覺得這樣只不過是把那你口中那十個 functor的 code
10/05 12:04, 1F

10/05 12:05, , 2F
用另一種形式寫出來吧了, 沒省多少東西...
10/05 12:05, 2F

10/05 12:39, , 3F
十個functor變一個functor總比寫十遍好吧..
10/05 12:39, 3F

10/05 12:39, , 4F
確實,如果你十個都有用到 compiler真的會具現化
10/05 12:39, 4F

10/05 12:40, , 5F
十個functor出來 但是寫一個總比寫十個簡單..
10/05 12:40, 5F

10/05 12:41, , 6F
template的精義就在於叫compiler幫你寫code啊XDD
10/05 12:41, 6F

10/05 16:10, , 7F
重點是沒有省多少 code 呀... 所謂重覆的部份也只是
10/05 16:10, 7F

10/05 16:11, , 8F
class XXX { public boolean operator < (const Y&){}}
10/05 16:11, 8F

10/05 16:27, , 9F
好處多多啊 1.十行變一行 2.避免duplicate code產生
10/05 16:27, 9F

10/05 16:28, , 10F
3.如果你宣告十個functor compile就會生十個給你
10/05 16:28, 10F

10/05 16:28, , 11F
但是template是你真的有用到才會產生
10/05 16:28, 11F

10/05 16:30, , 12F
template配什麼enum.. 要放也是放member function pointer
10/05 16:30, 12F

10/05 16:31, , 13F
如果你真的寫十個functor出來 以後要是functor功能
10/05 16:31, 13F

10/05 16:31, , 14F
要改 一口氣要改十個地方耶XD
10/05 16:31, 14F

10/05 16:36, , 15F
你這樣跟寫十個不同名字的getter有什麼不同
10/05 16:36, 15F

10/05 16:37, , 16F
是他們教授說要用template完成耶XD 啊不然我也知道
10/05 16:37, 16F

10/05 16:38, , 17F
用boost::bind一個functor都不用寫
10/05 16:38, 17F

10/05 16:41, , 18F
另外,和前述一樣的道理 你寫十個getter就是十個都
10/05 16:41, 18F

10/05 16:41, , 19F
會存在 但是template member function是需要的時侯
10/05 16:41, 19F

10/05 16:41, , 20F
才會產生出來的
10/05 16:41, 20F

10/05 16:42, , 21F
comparator寫成template就好啦 getter寫成template一點用
10/05 16:42, 21F

10/05 16:42, , 22F
都沒有
10/05 16:42, 22F

10/05 16:50, , 23F
好處是function call成本比較低啊 當然缺點就是靈活
10/05 16:50, 23F

10/05 16:50, , 24F
度比較差
10/05 16:50, 24F

10/05 16:52, , 25F
最大問題是把本來的class 污染了, 用 external functor
10/05 16:52, 25F

10/05 16:52, , 26F
其中一個原因就是想改 sorting criteria 的時候不需改
10/05 16:52, 26F

10/05 16:53, , 27F
model, 但這做法, 每加一個就要改一次 model
10/05 16:53, 27F

10/05 16:53, , 28F
根本和寫十個 compare_by_Xxx() compare_by_Yyy() 無異
10/05 16:53, 28F

10/05 16:55, , 29F
另, functor 的功能要改, 這個根本不成立吧. 到頭來
10/05 16:55, 29F

10/05 16:55, , 30F
省到的就是我說的那兩句, 換來的是 model 被污染, code
10/05 16:55, 30F

10/05 16:56, , 31F
變得難理解. 值得嗎? 還不要說要是要compare兩個field
10/05 16:56, 31F

10/05 16:56, , 32F
的話, 這做法也行不通
10/05 16:56, 32F
文章代碼(AID): #1AoMhxp2 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1AoMhxp2 (C_and_CPP)