gpt4 book ai didi

c++ - 在不丢失索引信息的情况下对 std::vector 进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:36 24 4
gpt4 key购买 nike

我想在不丢失索引信息的情况下使用存储值对 std::vector 进行排序。例如,

std::vector <int> vec;
vec.resize(3);
vec[0] = 20;
vec[1] = 10;
vec[2] = 6;
std::sort(vec.begin(), vec.end());
// Here I want to know the order of indices after sort operation which is 2, 1, 0

最佳答案

您想保存原始 vector 的排列,因此您需要另一个 vector 来从 {0, ... , n - 1} 构建正确的双射到 {0, ... , n - 1}:

vector<unsigned int> permutation( vec.size() );
for(unsigned int i = 0; i < vec.size(); ++i)
permutation[i] = i;

我们还没有排列任何东西。现在您不对第二个 vector 进行排序,而是对排列进行排序:

std::sort(permutation.begin(), permutation.end(), cmp);

如果你使用 C++11,cmp 可以是一个 lambda:

[&vec](unsigned int a, unsigned int b) { return vec[a] < vec[b];}

如果您使用 C++03,则需要将结构与 bool operator()(unsigned int, unsigned int) 一起使用:

struct comparator{
comparator(vector& v) : lookup(v){}
bool operator()(unsigned int a, unsigned int b){
return lookup[a] < lookup[b];
}
vector& lookup;
};

comparator cmp(vec);

然后可以使用 vec[permutation[i]] 遍历排序后的 vector 。

关于c++ - 在不丢失索引信息的情况下对 std::vector 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17621769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com