2014-12-13 63 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) ; 
    } 
}; 

然后设定为自动排序,当你在其中插入。

相关问题