按最后元素对矢量排序

时间:2009-09-17 09:58:19

标签: c++ vector sorting

有一个“矢量矢量” 看起来像这样

3 1 2 0 77
0 3 1 2 44
1 0 3 2 29
3 0 1 2 49

我想根据每一行中的最后一个元素对它们进行排序,以便它最终看起来像这样

1 0 3 2 29 
0 3 1 2 44
3 0 1 2 49
3 1 2 0 77

当然我的真实例子要复杂得多......但这基本上就是我需要完成的事情。 现在我使用这个片段似乎按照第一个元素进行排序。

vector<vector<int>>population;
partial_sort( population.begin(),population.begin()+10, population.end() );

3 个答案:

答案 0 :(得分:7)

您可以将std::sort与函数(或仿函数对象)一起使用,该函数为向量提供严格的弱排序。即你定义了一个vector-less-than函数来正确地命令两个向量,就像这样(在我的头顶)。 编辑:在评论之后,添加了对一个或两个空向量的检查,这确实使事情变得棘手。

bool CustomVectorCompare(const std::vector<int> &i_lhs, const std::vector<int> &i_rhs)
  {
  if(i_rhs.empty())
    return false; // If right side is empty, left can only be equal or larger

  if(i_lhs.empty())
    return true;  // Consider an empty vector to be "smaller" 
                  // than any non-empty vector.       

  return i_lhs.back() < i_rhs.back();
  }

  std::sort(population.begin(), population.end(), CustomVectorCompare);

答案 1 :(得分:6)

使用简单的std :: sort并传递一个仅比较向量的最后元素的仿函数。

  

Partial_sort重新排列[first,last]范围内的元素,使它们部分按升序排列。具体来说,它将最小的中间 - 第一个元素按升序排列到[first,middle]范围内。剩余的最后 - 中间元素以未指定的顺序放置在[中间,最后一个]范围内。

答案 2 :(得分:2)

您可以将比较器作为第四个参数传递给std::partial_sortstd::sort,因此只需使用调用运算符编写一个函数对象,该函数采用两个向量参数,以您希望的方式比较向量。