【问题标题】:C++ STL set usageC++ STL 集用法
【发布时间】:2017-09-24 10:11:32
【问题描述】:

我有一个类似下面给出的结构的std::set

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);
}

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

【问题讨论】:

    标签: c++ stl set operator-overloading


    【解决方案1】:

    集合将使用 lexicographic order 进行排序,意思是首先比较 y,如果 y 相等,则比较 w。

    这是如何工作的?

    std::tie 创建一个包含所有绑定元素的元组。 std::tuple 提供 comparison operators(用于您的 return 语句中的平局比较),它们基于字典顺序。

    如何使用不同的顺序?

    如果您只想使用特定的“参数”(我理解为“成员”)进行比较,则要么定义您的 operator&lt; 以仅使用该成员,要么在构建集合时提供 ad-hoc comparator

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

    【讨论】:

      【解决方案2】:

      在您的情况下,最好使用 C++ std::pair。

      set<pair<int,int> >st;
      

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

      一般来说: C++ STL 使用已知类型的比较器(先对后对,一组整数按升序排列)。

      但对于 std::set 它使用

      【讨论】:

      • 您建议使用一对而不是结构。如果结构是临时的并且仅用于集合(正如最初的 temp 命名所暗示的那样),那么该对将是有效的替代方案。但是 OP 的问题表明该结构包含更多数据(运算符使用 weight 而不是 temp,并且 OP 认为仅使用一些特定的“参数”进行比较而不是全部,这表明该结构包含其他有价值的数据)。所以我不确定pair是否真的会成为最终的选择。
      • @Christophe 你毫无疑问是正确的。但我建议使用这对,因为它在很多情况下都有效,对我来说,我总是使用一组对,但是当我参加竞争性编程比赛时会发生这种情况。在一般情况下说清楚,我会和你一起去。
      猜你喜欢
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      相关资源
      最近更新 更多