1. 程式人生 > >關於set或map的key使用自定義型別的問題

關於set或map的key使用自定義型別的問題

我們都知道set或map的key使用自定義型別時必須過載<關係運算符
但是,還有一個條件,所呼叫過載的小於操作符,使用的物件必須是const
而物件呼叫的方法也必須是const的

1 #include
2 #include
4 #include
7 using namespace std;
8
9 class Point{
10 public:
11 Point(int X, int Y):x(X), y(Y){};
12 int get_x()const{
13 return x;
14 }
15 int get_y()const{
16 return y;
17 }
18 private:
19 int x;
20 int y;
21 };
22
23 inline bool operator<(const Point &p1, const Point &p2){
24 return p1.get_x() < p2.get_x();
25 }
26
27 int main(int argc, const char *argv[])
28 {
29 map test;
30 Point p1(1, 2);
31 test[p1] = 5;
32 return 0;
33 }
這樣的是正確的,沒有問題

1 #include
5 #include
7 using namespace std;
8
9 class Point{
10 public:
11 Point(int X, int Y):x(X), y(Y){};
12 int get_x(){
13 return x;
14 }
15 int get_y(){
16 return y;
17 }
18 inline bool operator<(Point &p1,Point &p2){
19 return p1.get_x() < p2.get_x();
20 }
21 private:
22 int x;
23 int y;
24 };
25
26
27 int main(int argc, const char *argv[])
28 {
29 map test;
30 Point p2(1,2);
31 test[p2] = 5;
32 return 0;
33 }
而這樣的,在編譯時會出現很多相關的編譯錯誤
出現這樣的原因是,在map或set使用時,它們會自動的呼叫小於操作符來建立底層的紅黑樹
但是這裡有一個條件就是在呼叫的過程中,key是不允許改變的,但是如果你宣告為non-const
那麼它的值可能會被改變,所以編譯會出錯。