作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] 關於stl的operator
時間Sun Jun 5 22:24:01 2011
※ 引述《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