map存放結構體、類的例子

面試中問到了一個問題,定義一個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

相關文章
相關標籤/搜索