【问题标题】:Sort a vector c++ [duplicate]对向量c ++进行排序[重复]
【发布时间】:2013-10-15 21:50:53
【问题描述】:

我正在尝试使用以下类型对 2D 向量进行排序:

vector<pair<char, double>> output;

我正在尝试将它们从最高到最低的 double 值排列,并且只显示前 5 个。这就是我想要做的:

sort(output.begin(), output.end());

但是这种方法对我来说不能正常工作。我做错了什么?

【问题讨论】:

  • 您可能想定义自己的比较函子。
  • 定义“不能正常工作”。向我们展示代码。
  • 另一种可能...用双字符对交换字符双字符对,然后直接对其进行排序..额外的+O(N)时间无关紧要,因为排序是O(NlogN)和额外的 O(N) 内存......如果你能负担得起的话。

标签: c++ sorting vector 2d


【解决方案1】:

默认情况下,std::sort 将对容器的元素使用小于比较运算符,这将首先使用char 然后使用double 执行字典比较。

您可以使用自己的排序函数/函子,该函数仅基于对的double 元素进行排序:

bool cmp(const std::pair<char, double>& lhs, 
         const std::pair<char, double>& rhs)
{
  return lhs.second > rhs.second;
}

然后

std::vector<std::pair<char, double>> output = ....;
sort(output.begin(), output.end(), cmp);

working demo here

【讨论】:

  • 错误 1 ​​错误 C3867: 'CaesarCypher::cmp': 函数调用缺少参数列表;使用 '&CaesarCypher::cmp' 创建指向成员的指针
  • @user977154 你做错了什么! cmp 函数是非成员函数。
  • 错误 2 错误 C2780: 'void std::sort(_RanIt,_RanIt)' : 需要 2 个参数 - 提供 3 个
  • 即使将其设为非成员函数也无法编译
  • @user977154 要么您做错了其他事情,要么您的标准库安装已损坏。见this compiling demo
【解决方案2】:

正如 Violet 所说,您可能希望包含自己的比较函数:

class compare
{
public:
    bool operator() (std::pair<char, int> const& p1,
                    std::pair<char, int> const& p2) const
    {
        // perform logic here
    }
} Predicate;

std::sort 使用operator &lt; 比较元素,并相应地对它们进行排序。它有一个额外的用于比较函子的可选参数,我们可以像这样包含它:

std::sort(output.begin(), output.end(), Predicate);

请注意,这也可以使用 C++11 中的 lambda 来完成。

【讨论】:

  • 我不确定,但比较器不一定是带有签名bool(const value_type&amp; , const value_type&amp;) 的东西(函数、lambda、函子)?我认为你应该写operator() 而不是operator&lt;
  • @Manu343726 就是这样。 std::sort 将在内部调用 compare::operator &lt;
  • mmmm 不,不是可调用对象,您只定义了比较运算符。
  • @Manu343726 好的,谢谢,我已经改了。
【解决方案3】:

您使用成对向量是否有原因?换句话说,元素在内部存储的顺序对你来说真的很重要吗?如果没有,您最好使用带有反向迭代器的 map&lt;double,char&gt; 来获取按双精度值排序的最后 5 个元素。

【讨论】:

    【解决方案4】:

    您需要在pair&lt;char, double&gt; 操作数之间编写一个比较运算符。 http://en.cppreference.com/w/cpp/algorithm/sort

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 2018-10-08
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多