sort std :: vector而不会丢失索引信息

时间:2013-07-12 18:35:36

标签: c++ sorting stdvector

我想使用存储的值对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

1 个答案:

答案 0 :(得分:11)

您想要保存原始矢量的排列,因此您需要另一个矢量来构建从{0, ... , n - 1}{0, ... , n - 1}的正确投影:

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

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

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]]遍历已排序的向量。