2014-12-13 55 views
0

屬性值進行排序我有這樣的結構:的std ::設置< struct >在結構C++

struct abc { 
    int x, y; 
    char s[20]; 
}; 

bool comp(abc a, abc b) { 
    int n = strlen(a.s), m = strlen(b.s); 
    for(int i = 0; i < min(n,m); i++) 
     if(a.s[i] != b.s[i]) 
      return a.s[i] < b.s[i]; 
    return n < m; 
} 

我想使一組與該結構由s[]排序,但我不知道怎麼辦。

+3

要麼使用當你創建你的['std :: set'](http://en.cppreference.com/w/cpp/container/set)時,你的'comp'函數或者爲你的類型創建'operator <'函數。 – 2014-12-13 11:27:01

+0

@JoachimPileborg給我一個例子,當我創建std :: set時如何使用comp函數,因爲我不知道如何編寫,對不起我的英文不好 – behemoth 2014-12-13 11:33:25

+0

請按照我以前的評論中的鏈接查看例如構造函數,或轉到您最喜愛的搜索引擎並搜索例如「C++設置自定義比較」 – 2014-12-13 11:44:05

回答

2

一個選項是爲您的結構重載operator<。任何想要比較排序順序的標準算法/容器默認都會使用它。

bool operator<(abc const & a, abc const & b) { 
    // your code here 
} 

或者,你可以指定你的比較只是爲了集:

std::set<abc, bool(*)(abc,abc)> my_set(comp); 

這將是一個功能類,而不是功能多一點方便:

struct comp { 
    bool operator()(abc const & a, abc const & b) { 
     // your code here 
    } 
}; 

std::set<abc, comp> my_set; 
1

您需要爲abc定義<運算符,以便stl知道如何比較兩個abc實例。 那麼如何比較具有3個字段的結構的兩個成員?使用lexicographical order

以下是您的示例的實際實施。

struct abc { 
    int x, y; 
    char s[20]; 

    const bool operator < (const abc &r) const{ 
     return (x< r.x) 
       ||((x== r.x) && (y< r.y)) 
       ||((x== r.x) && (y== r.y) && strcmp(s,r.s)<0) ; 
    } 
}; 

然後設定爲自動排序,當你在其中插入。

相關問題