我有一个整数对的向量,即
std::vector< std::pair<int, int> > V;
我想对这个向量进行排序,所以我编写了一个快速排序实现。谢天谢地,std:成对已经定义了智能比较运算符,例如
[[3, 1], [1, 7], [3, 5]]
分类到
[[1, 7], [3, 1], [3, 5]]
即根据每对中的第一个元素进行排序,使用第二个元素作为平分器。
但我真正想要的是比较第二个元素的递减顺序。因此,上面的示例应该被排序为
[[1, 7], [3, 5], [3, 1]]
是否可以重写std::pair
的比较运算符,以便通过增加第一元素和减少第二元素进行排序?如果不是,从设计角度看,实现这一目标的最佳方法是什么?
我考虑从std::pair
派生一个子类,它覆盖了所有的比较运算符,但是这需要reinterpret_cast
ing std::pair<int, int>*
来指向我的子类,这感觉非常错误。
那么唯一的方法是一个单独的静态助手类吗?(除了将所有第二个元素乘以-1这样的黑客之外,考虑到所有的值都是正的。)
发布于 2017-04-12 00:36:33
您应该遵循C++库的一般设计原则,并使用比较器。有序关联容器模板(如std::set
)具有一个可选的模板参数,即设置排序顺序的比较器类。例如:
std::set<int>
给出一个集合,将其int
值按自然、递增、有序顺序排序。迭代这个股票集将迭代它的值从最小到最高值。
但这只是因为std::set
实际上有第二个模板参数,即比较器,它默认为性病:较少,基本上是<
操作符的包装器。这个std::set
实际上是:
std::set<int, std::less<int>>
(还有第三个模板参数,与本讨论的目的无关)。
如果您想要声明,则可以声明:
std::set<int, std::greater<int>>
然后,如果你要在这个集合上迭代,你会发现你将从集合中的最大值到最小值进行迭代。在所有其他方面,这个集合就像一个普通的集合一样工作。
同样,让我们讨论一下您编写的快速排序实现。快速排序直接使用<
运算符来比较您的std::pair
,您应该简单地重写您的快速排序实现,以获得一个额外的参数,即一个比较器,它指定排序顺序。与仅仅使用重载的<
操作符不同,您的快速排序实现将调用比较器来比较这两对。
现在,您可以使用一个接受两个任意std::pair
的可调用对象来加快对对的排序,并计算它们的相对顺序。
https://stackoverflow.com/questions/43358271
复制相似问题