【问题标题】:Sorting vector according to the third number in column [closed]根据列中的第三个数字对向量进行排序[关闭]
【发布时间】:2016-06-13 09:44:58
【问题描述】:

我有一个包含 3 列的向量。

{0,1,10}
{0,2,15}
{0,3,33}
{0,4,12}

我怎样才能得到下一个结果?

{0,3,33}
{0,2,15}
{0,4,12}
{0,1,10}

我认为我应该使用以下代码:

std::sort(a.begin(), a.end(),
    [](const std::vector< int >& a, const std::vector< int >& b)
    { return a[1] > b[1]; });

所以我需要根据每个向量中的第三个数字进行排序,但前两个也应该上升,因为我需要一个带有排序向量的列表。

【问题讨论】:

  • according to the third numberreturn a[1] &gt; b[1]?

标签: c++


【解决方案1】:

在用于比较主向量元素的 lambda 中,检查第二个元素,而不是第三个。此外,您不会比较其他值。所以如果你用文字写出你想要的:

v1 大于 v2:

  • 如果 v1 第三个元素大于 v2 第三个元素
  • 或者如果 v1 第三个元素等于 v2 第三个元素并且 v1 第二个元素大于 v2 第二个元素
  • 如果 v1 和 v2 的最后 2 个元素相等且 v1 第一个元素大于 v2 第一个元素

只需将其翻译成 c++:

http://coliru.stacked-crooked.com/a/44fff0423ff6ca6b

std::sort(a.begin(), a.end(),
    [](const std::vector< int >& a, const std::vector< int >& b)
        { 
            return a[2] > b[2]  // Note here 2 instead of 1
                || (a[2] == b[2] && a[1] > b[1])
                || (a[2] == b[2] && a[1] == b[1] && a[0] > b[0]); 
        });

【讨论】:

  • 非常感谢。你的答案就是我想要的!
【解决方案2】:

是的,但是,您也可以使用这样的功能对象。在这种情况下,Lambas 和函数的工作速度比函数对象慢。功能对象是最好的解决方案

class my_compare_class
{
public:
    inline bool operator()(const std::vector< int > &a, const std::vector< int > &b)
    {
        // Third column is 2-nd index, because counting was started from 0
        return a[2] > b[2];
    }
};

使用std::sort(a.begin(),a.end(),my_compare_class());

编辑:使用示例添加。

【讨论】:

  • 这将按照要求按相反的方向排序...
  • @Aconcagua 哎呀...
  • 并将其用作std::sort(a.begin(),a.end(),my_compare_class());
  • 任何链接都显示了为什么 lambdas 比 functors 慢?有人说 lambda 更好,因为代码更少,逻辑在实际排序的地方。
  • @Inline:请注意,“已回答的问题”上接受的答案否定了您所说的 (stackoverflow.com/a/13722515/104774),所以我们称之为未定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多