1、使用結構體grid作為map的key
struct grid { int x; int y; };
(1)需要自定義比較函數operator<,不然會報錯:
error C2784: “bool std::operator <(const std::deque<_Ty,_Alloc> &,const std::deque<_Ty,_Alloc> &)”: 未能從“const grid”為“const std::deque<_Ty,_Alloc> &”推導 模板 參數
(2)需要定義為const成員函數,不然會報錯:
error C2678: 二進制“<”: 沒有找到接受“const grid”類型的左操作數的運算符(或沒有可接受的轉換)
(3)需要確定唯一序
如果只寫
return x<g.x
那么對於(1,2)和(1,1),比較結果為(1,2)<(1,1)並且(1,1)<(1,2),然而顯然兩者並不相等。
正確的定義方法為:
struct grid { int x; int y; bool operator<(const grid& g) {//define operator for custom key if(x != g.x) return x < g.x; else return y < g.y; } };
2、自定義標准庫函數sort的compare
(1)compare函數中,如果是升序,必須是<而不是<=,否則出現相同元素時會運行錯誤:
解釋:參考http://www.cplusplus.com/reference/list/list/sort/,比較必須產生strick weak ordering。
對於strick weak ordering 可以參考http://stackoverflow.com/questions/979759/operator-and-strict-weak-ordering/981299#981299
的詳細說明。
總之,如果a,b不等,那么compare(a,b)和compare(b,a)其中之一為true,另一為false。
如果a,b相等,則都應該為false。
(2)compare函數必須聲明為靜態成員函數或者全局函數,不能作為普通成員函數,不然會報錯:
error C3867: “Solution::compare”: 函數調用缺少參數列表;請使用“&Solution::compare”創建指向成員的指針
解釋:非靜態成員函數是依賴於具體對象的,而std::sort這類函數是全局的,因此無法在sort中調用非靜態成員函數。
可以把compare改成靜態或者全局函數,使之不依賴於具體對象。