按最后一个元素对向量进行排序

Posted

技术标签:

【中文标题】按最后一个元素对向量进行排序【英文标题】:Sort vectors by last elements 【发布时间】:2009-09-17 09:58:19 【问题描述】:

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

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

当然,我的真实示例要复杂得多……但这基本上是我需要完成的。 现在我使用这个 sn-p 似乎是根据第一个元素排序的。

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

【问题讨论】:

【参考方案1】:

您可以将std::sort 与为向量提供严格弱排序的函数(或函子对象)一起使用。 IE。您定义了一个向量小于函数,它可以正确地对两个向量进行排序,就像这样(在我的脑海中)。 编辑:在 cmets 之后,添加了对一两个空向量的检查,这确实使事情变得更加棘手。

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);

【讨论】:

谢谢会尝试一下...以为我可以放一个参数或其他东西来比较第n个元素但是... 确保在向量之一是 emoty 的情况下扩充此代码。 你也可以使用vector::back()代替*vector::rbegin() Dur...今天早上我的头在哪里...谢谢你的 RPG。 你不应该覆盖 operator() 而不是 operator 【参考方案2】:

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

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

【讨论】:

谢谢.. 我想在我的示例中进行部分排序以节省 cpu 时间...但是我如何“传递一个仿函数”,无论排序/部分排序如何,我都应该以相同的方式完成。 . 查看 MadKeithV 的答案以获取示例实现。【参考方案3】:

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

【讨论】:

以上是关于按最后一个元素对向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按字典顺序对c ++中的多维向量进行排序

向量排序算法,只对大于 0 的元素进行排序

c ++如何按类类型对向量进行排序

通过元素指针的无序映射作为键对向量进行排序

如何根据对的第二个元素对对的向量进行排序?

C++ 按索引对向量进行排序