面試中問到了一個問題,定義一個map<A,int>,key是一個類,value是一個int型值,問這個類有什麼限制嗎?ios
當時沒想出來,回頭本身試的時候確實編譯不過,報的錯誤是面試
error: no match for ‘operator<’ (operand types are ‘const A’ and ‘const A’)
{ return __x < __y; }函數
後來想了想,換成結構體呢,結果報錯也是同樣,以後就忽然想到map它是內部有序,作了排序機制的,因此你得定個規則讓它有序,因此得重載operator < 運算符函數,而後寫個規則給它(map也有無序的,unordered_map)。spa
寫個例子:code
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 5 /*map內部有排序機制,它是有序的,當map存結構體或者存類的時候,要重載operator < 運算符函數 6 */ 7 8 class A{ 9 int id; 10 string name; 11 public: 12 virtual void test(){ 13 cout << "A::test()" << endl; 14 } 15 bool operator < (const A &a) const 16 { 17 return id < a.id; 18 } 19 }; 20 21 struct B{ 22 int id; 23 string name; 24 B(){} 25 B(int x,string y):id(x),name(y){} 26 bool operator < (const B &a) const 27 { 28 return id < a.id; 29 } 30 }; 31 32 int main(){ 33 //map放類 34 map<A,int> tmap; 35 A a; 36 int num = 10; 37 tmap[a] = num; 38 39 /*--------------------------------------------------------------------------------*/ 40 //map放結構體 41 // map<B,int> bmap; 42 // for (int i = 0; i < 10; i++) { 43 // bmap.insert(pair<B, int>(B(i,"name"+i),i)); 44 // } 45 46 // for (auto it = bmap.begin(); it != bmap.end(); ++it) { 47 // cout << it->first.name << "-->" << it->second << endl; 48 // } 49 50 return 0; 51 }
OK!這樣問題就解決了blog