看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《Arim (Arim5566)》之銘言: : 小弟對於這方面的觀念可能與之前有些出入 : 比如說我定義了一個struct如下 : struct yline : { : int line; : int insert_priority; : yline(){} : yline(const int iyline,const int iip): // to initialize the member data : line(iyline),insert_priority(iip){}; : bool operator<(const yline & cp) const : { : int cpy=function(cp.line) : int y=function(line); : if(y==cpy) : { : return insert_priority<cp.insert_priority; : } : else{ : return y>cpy; : } : } : }; 首先, 對某特定類別物件的操作是視情況加入的, 而不是先加之後 發現不對然後再改來改去, 所以 yline 類別的原型應該只是這樣: class yline { int y; int insert_order; public: yline() = delete; yline( int x, int the_insert_order ) : y( function(x) ), insert_order( the_insert_order ){ } int get_y() const { return y; }; int get_insert_order() const { return insert_order; }; }; 既然每次比較都要代入別的函數求值, 還不如直接存算出來的結果 就好, 把整數pass by value傳遞時, 加上const修飾字只代表你少 了兩個變數可用, 並不會帶來其他好處. : 其中的functon是要算再給定x的情況下,計算每條線的y值 : y是由大到小排序,如果y一樣的話就比較當初insert的順序 : 較早insert的話就排前面(也就是insert_priority較小) : 但是很奇怪的是 : 有些pair(line,insert_priority)沒辦法在目前的set中找到 假如有兩個 yline物件 a, b 要來比大小, 所謂相等的意思是使得 以下兩個函式呼叫皆回傳假. ( 這是第一點. 上次好幾個大大在推 文裡就有指出這點了) 1. Compare( a, b ) 2. Compare( b, a ) yline( 5, 7 ) 跟 yline( 4, 8 ) 比較的時候, 關鍵是你程式碼 else 的部份: else{ return y > cpy; } 當呼叫情境是(假設function會回傳參數自己本身): yline( 5, 7 ) < yline( 4, 8 ) 因為 function( 5 ) > function( 4 ), 在這裡回傳的結果就不合 預期了, 這是第二點. 正確的 functor應該長成這樣 (注意黃底部 分): auto yline_less_than = []( const yline &lhs, const yline &rhs ) -> bool { if( lhs.get_y() < rhs.get_y() ) return true; else if( lhs.get_y() == rhs.get_y() ) return lhs.get_insert_order() < rhs.get_insert_order(); return false; }; : 比如目前set的元素裏面有兩個yline(5,7),yline(6,8) : 也就是有線段5跟線段6 : 線段5的insert的順序在線段6的前面(7<8) : 但是我用set.find(yline(5,7)); //可以找到線段5 : 而用set.find(yline(6,8)); //很奇怪,找不到線段6 : 當然上面的例子是我舉例的情形..可能實際上在跑的時候可以找到.. : 如果我把比較的順序對調的話(比如說y>cpy改成cpy>y) : 結果又會不一樣(某某線段本來有找到,可是改了之後又找不到@@) : 所以想請問operator的行為到底要怎麼定義才是符合我的需求? 附上完整程式碼, yline 更名為 record http://goo.gl/bNb9z 最好的方式就是: 不要為自訂型態定義operator, 因為隨著你得到 便利的同時, 也有很多語意是必須為使用者實現的 (也為了STL Containers) , 亂用 STL比不用還糟! 而且錯誤訊息也不是一般人 看得懂的... -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
LPH66:問一個問題 ctor 那邊 = delete; 是什麼語法? 06/06 01:57
hilorrk:pure virtual function不是應該是=0嗎? 06/06 02:01
LPH66:ctor 不能 virtual 吧...所以顯然不會是 = 0 的意思 06/06 02:02
可參考 N2346 http://goo.gl/MbKYi 因為在這邊「預設」是沒有意義的, 所以我將其定義刪去
LPH66:原來是 C++0x 的新東西...(筆記) 06/06 03:29
※ 編輯: loveme00835 來自: 140.121.197.115 (06/06 03:55)
tomap41017:C++0x多了很多怪物(誤) 06/06 11:43
VictorTom:C++不用0x就已經是個怪物了(無誤XD) 06/06 12:58
Arim:謝謝樓上大大~STL的錯誤訊息真的難懂 06/06 13:05
Arim:應該是說謝謝原po^^ 06/06 13:05
Arim:不過有一個問題就是說..每次發生事件的時候x都會改變 06/06 13:35
Arim:所以我才沒有把y設成member,因為key不能夠被修改... 06/06 13:35
Arim:因為每次發生事件的時候,set裏面的order都會變更 06/06 13:35
Arim:也就是說在insert(6,8)的時候,function(5)的y會跟之前不一樣 06/06 13:39
tomap41017:樓上這樣似乎要考慮好資料結構存放喔 06/06 19:05
tomap41017:確定STL的語意是你想要的,否則可能有未義行為 06/06 19:06
tomap41017:未定義 06/06 19:06