我需要做以下事情:
给定std::vector
int
我需要将每个int
替换为向量排序时的索引。
我会尝试用一个例子来解释它。
输入:{22, 149,31}
输出:{2, 0, 1}
(请注意,在排序后的矢量{149,31,22}中, 22 位于已排序矢量的索引2 中, 149 在索引0 , 31 在索引1 )
我希望我能清楚算法。
这是以某种方式在STL C ++ 11库中实现的吗?这个算法有名吗?你能提供任何想法来优雅地实现它吗?
答案 0 :(得分:13)
我认为它没有名字,但它很容易实现。
首先,创建一个目标矢量并用索引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中翻转比较。