2017-09-24 64 views
1

我有一个结构的std::set像一个如下:C++ STL集合使用

struct weight{ 
int y; 
int w; 
}; 

与比较定义为:

bool operator <(const weight&lhs,const weight&rhs) { 
    return tie(lhs.y,lhs.w)<tie(rhs.y,rhs.w); 
} 

凭什么将集进行排序?以及如何对给定参数上的集合进行排序,还有人可以解释上面使用的函数的工作原理吗? 感谢

回答

3

该组将使用lexicographic order,意义进行排序,首先它比较y和如果y是相等的,那么它比较瓦特

这是如何工作的?

std::tie创建所有被捆绑的元素的元组。 std::tuple提供comparison operators(用于您的return语句中的领带比较),它基于字典顺序。

如何使用不同的顺序?

如果你想只使用一个特定的“参数”(我的理解“会员”)的比较,然后要么定义operator<只使用该成员或构造您所设定的时为其提供ad-hoc comparator

定义比较之前但是三思而后行。添加到集合中的所有元素都必须是唯一的。这种唯一性由等价关系决定(即,如果两个对象的比较都小于另一个,则认为两个对象是等价的)。因此,如果您的比较器仅使用一个结构成员(例如w),则无法插入两个具有相同w值的对象。

2

优选在你的情况下使用C++的std ::对。

set<pair<int,int> >st; 

在这种情况下,它将按照pair.first然后pair.second的顺序进行排序。

一般情况下: C++ STL使用比较器的已知类型(先配对然后秒,一组整数按升序排序)。

但是对于std :: set,它使用了<运算符,所以当定义std :: set中使用的结构时,必须重载运算符<。

+0

您建议使用一对而不是结构。如果结构是临时的并且仅用于集合(因为原始的'temp'命名可以建议),那么这对结构将是有效的替代方案。然而,OP的问题表明,结构包含更多的数据(操作符使用'weight'而不是'temp',并且OP认为只使用一些特定的“参数”来进行比较而不是全部,这表明该结构包含其他有价值的数据)。所以我不确定是否真的会走到最后。 – Christophe

+0

@Christophe你毫无疑问是正确的。但我建议这对,因为它在很多情况下工作,对我来说,我总是使用一套对,但是当我进行竞争性编程比赛时会发生这种情况。在一般情况下明确表示我会和你一起去。 –