【问题标题】:Sort-related algorithm (replace each item by its index in the sorted colletion)排序相关算法(用排序集合中的索引替换每个项目)
【发布时间】:2013-10-17 16:29:20
【问题描述】:

我需要做以下事情:

鉴于int 中的std::vector,我需要将每个int 替换为对向量进行排序时所在的索引。

我会尝试用一个例子更好地解释它。

输入:{22, 149,31}

输出:{2, 0, 1}

(请注意,在排序向量 {149, 31, 22} 中,22 在排序向量的 index 2 中,149index 031index 1)

我希望我把算法说清楚。

这是在 STL C++11 库中以某种方式实现的吗?这个算法有名字吗?你能提供任何想法来优雅地实现它吗?

【问题讨论】:

  • 我不知道它有名字,但它与this question非常相似。看起来你是在降序排序,但除此之外它基本上是同样的问题。
  • 这叫做“用比较函数排序”。您可以使用比较函数中的索引值对索引进行排序。
  • 如果您的输入是{22, 149, 31, 149},您希望输出是什么?

标签: c++ algorithm sorting stl


【解决方案1】:

我不认为它有名字,但它很容易完成。

首先,您创建一个目标向量并用索引 0...n 填充它。

vector<int> indices(input.size());
std::iota(indices.begin(), indices.end(), 0);

其次,您对该向量进行排序,但不是比较向量中的数字,而是比较输入向量中相关索引处的数字。

std::sort(indices.begin(), indices.end(),
          [&input](int l, int r) { return input[l] < input[r]; });

编辑请注意,我按升序排序,而您正在寻找降序。只需翻转 lambda 中的比较。

【讨论】:

  • +1 但有一点点挑剔:vector&lt;int&gt; indices; indices.reserve(input.size()); iota_n(std::back_inserter(indices), input.size(), 0); 在生成索引方面会稍微高效一些。对于iota_n,请参见例如this Q&A
猜你喜欢
  • 2018-07-26
  • 2016-06-06
  • 2011-06-03
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
相关资源
最近更新 更多