2015-06-14 58 views
1
#include<bits/stdc++.h> 
using namespace std; 

struct segment{ 
    int a; 
    int b; 
    int c; 

    bool const operator<(const segment &o) const { 
     return a < o.a; 
    } 
}; 


int main() 
{ 
    map<segment,int> myMap; 
    map<segment,int>::iterator it; 
    struct segment x,y,z; 

    x.a=2; 
    x.b=4; 
    x.c=6; 

    y.a=2; 
    y.b=5; 
    y.c=8; 

    z.a=2; 
    z.b=4; 
    z.c=6;   

    myMap[y]++; 
    myMap[z]++; 
    myMap[x]++; 

    for(it =myMap.begin(); it != myMap.end(); it++) 
     cout<<(*it).first.a<<" "<<(*it).second<<endl; 
    return 0; 
} 

它給出的結果比較運營商在C++地圖結構關鍵

2 3 

,但我想它打印

2 1 
2 2 

總之我希望增加的地圖,如果價值提供完全相同的結構實例,而不是製作新副本

+0

然後你必須改變少運算符和比較所有成員。 – Tim3880

+0

我沒有得到你所說的。你可以給比較器的代碼嗎? – Maroof

+0

我試過一個嵌套的if else語句,但它不能正常工作 – Maroof

回答

1

就您的map而言,這裏只是一個獨特的對象。根據您指定的比較,以及隱含的等值,x == yy == z。爲什麼?它們都不比另一個小,所以根據STL邏輯的比較,它們必須是等價的。

也許你正在尋找一個std::multimap

或者,如果要定義中的所有成員的條款不平等(因此隱含的等價),你可以做這樣的事情:

#include <tuple> 

bool const operator<(const segment &o) const { 
    return std::make_tuple(a, b, c) < std::make_tuple(o.a, o.b, o.c); 
} 

附:你應該避免包含來自bits的東西,因爲你包含了實現的東西。相反,嘗試用這樣的東西

// See? no bits. 
#include <map> 
+0

如果再次輸入相同的密鑰,我想增加地圖的值。並要求鍵相等,我想要一個== o.a,b == o.b,c == o.c。我能在地圖上實現嗎? – Maroof

+0

@Maroof查看更新。 –

1

您可以在更少的運營商變更爲:

bool const operator<(const segment &o) const { 
    return a < o.a || (a == o.a && b < o.b) || (a==o.a && b==o.b && c < o.c) ; 
} 

這A,B,C的順序的值進行比較。

但是你可以改變它,無論如何你想比較結構。

+0

謝謝。有效 – Maroof

6

海事組織多個成員比較的最好方法是使用std::tie,因爲它是更難搞糟:

bool const operator<(const segment &o) const { 
    return std::tie(a, b, c) < std::tie(o.a, o.b, o.c); 
} 

編輯:只想這個鏈接添加到cppreference爲例,幾乎完全是你的問題。