有一个“矢量矢量” 看起来像这样
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() );
答案 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_sort
或std::sort
,因此只需使用调用运算符编写一个函数对象,该函数采用两个向量参数,以您希望的方式比较向量。