【问题标题】:Sorting an STL vector on two values根据两个值对 STL 向量进行排序
【发布时间】:2011-10-09 22:13:35
【问题描述】:

如何根据两个不同的比较标准对 STL 向量进行排序?默认的 sort() 函数只接受一个排序器对象。

【问题讨论】:

  • 您能详细说明一下吗?你想要什么标准?
  • 我正在对具有两个不同属性的对象列表进行排序:距离和重要性。其中一个属性的比较(更高的重要性)会覆盖另一个(更近的距离)。因此,假设一个对象的重要性为 1,而另一个对象的重要性为 0,则即使距离较大,它也会比第二个对象排序更高。仅通过一次比较,我无法找到一种方法。

标签: c++ sorting stl vector


【解决方案1】:

您需要将这两个条件合二为一。 下面是如何使用第一个和第二个字段对结构进行排序的示例 基于第一个字段,然后是第二个字段。

#include <algorithm>

struct MyEntry {
  int first;
  int second;
};

bool compare_entry( const MyEntry & e1, const MyEntry & e2) {
  if( e1.first != e2.first)
    return (e1.first < e2.first);
  return (e1.second < e2.second);
}

int main() {
  std::vector<MyEntry> vec = get_some_entries();
  std::sort( vec.begin(), vec.end(), compare_entry );
}

注意:compare_entry 的实现已更新为使用来自 Nawaz 的代码。

【讨论】:

  • +1,直截了当。我也是这么想的。但仍然怀疑 OP 的想法是否相同。
  • 太好了,成功了,谢谢!我忘记了 if( e1.first == e2.first ) 部分,所以它对我来说失败了。
  • @Michael:我添加了compary_entry 函数的另一个实现。希望你没事。 :-) +1 顺便说一句。
  • +1 Nawaz - 我喜欢这种变化。我确信它可以更整洁一些.. 你做得很完美。
  • 我个人更喜欢return e1.first != e2.first ? e1.first &lt; e2.first : e1.second &lt; e2.second;,但每个人都有自己的;-)。另外,如果类型支持指示小于、等于或大于的单个查询(如strcmp),这有时会明显更有​​效:switch (e1.first.cmp(e2.first)) { case -1: return true; case 0: return e1.second &lt; e2.second; case 1: return false; }(假设 -1/0/1 值,一些 cmps 只是promise -ve/0/+ve 和相应的实现变化)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2011-01-23
相关资源
最近更新 更多