[英]Comparator - overloading the operator <
我正在嘗試使用std::set
包含三個成員變量的結構。
struct blah{
int a,b,c;
bool operator < ( const blah& blo ) const{
return ( a < blo.a || (a == blo.a && (b != blo.b || c != blo.c ) ) );
}
};
但我不斷收到一個錯誤,提示我的運算符<無效。 我的方法有什么問題?
struct blah {
int a,b,c;
blah(int aa,int bb,int cc){ a=aa; b=bb; c=cc; }
bool operator < ( const blah& blo ) const{
return ( a < blo.a
|| (a == blo.a && b < blo.b )
|| (a == blo.a && b == blo.b && c < blo.c )
);
}
};
int main() {
std::set<blah> st;
st.insert(blah(1,2,3));
st.insert(blah(1,1,1));
st.insert(blah(1,3,2));
return 0;
}
在更改@paxdiablo代碼之后的代碼后,此方法運行良好。 謝謝大家!
在以下完整程序中,該代碼對我來說很好編譯 :
#include <iostream>
struct blah {
int a,b,c;
bool operator < ( const blah& blo ) const{
return ( a < blo.a || (a == blo.a && (b != blo.b || c != blo.c ) ) );
}
};
int main (void) {
blah x, y;
x.a=2; x.b=2; x.c=2;
y.a=2; y.b=2; y.c=2;
if (x < y) std::cout << "x<y\n";
if (y < x) std::cout << "x>y\n";
if (!(y < x) && !(x < y)) std::cout << "x=y\n";
return 0;
}
更改x
和y
的字段將輸出不同的消息。
但是我發現該功能存在一個主要問題。 它可以告訴您x < y
和 y < x
兩者,在兩個a
字段相同但b
字段在兩者之間不同的情況下。 如果同時設置了a
字段1,設置b
字段2
和1
,您會看到:
x<y
y<x
那不會很好地結束:-)
正是你得到的是一個調試斷言(某事的具體建趕上大多在調試代碼的運行時錯誤),這一事實使我相信,運行時庫可以明確地檢查不正確operator<
通過檢測重載后一種情況下(即, x < y
和 y < x
都為真)。
您應該真正解決此問題,因為這將導致集合的各種問題(例如,您需要對事物進行排序)。
舉例來說,假設您要使用a
, b
和c
作為該優先級的鍵。 要執行此操作的函數將包含以下內容:
// Check primary key.
if (a < blo.a) return true;
if (a > blo.a) return false;
// Primary key equal here, use secondary key.
if (b < blo.b) return true;
if (b > blo.b) return false;
// Primary and secondary keys equal here, use tertiary key.
return (c < blo.c);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.