测试代码:(对向量进行排序,取一定范围内的数值)
vector<int> vec = {5,31,9,11,8,21,9,7,4};
vector<size_t> idx;
idx = sort_indexes_e(vec);//注意vec中的内容不变,不是返回排序后的向量
//sort_indexes(idx,vec);//注意vec中的内容不变,不是返回排序后的向量
vector<int> vecs;
for (int i = 2; i < 6; i++)
{
vecs.push_back(vec[idx[i]]);
}
输出:vec: 5 31 9 11 8 21 9 7 4
idx:8 0 7 4 2 6 3 5 1
vecs:7 8 9 9
对vector进行排序,并返回索引值,可以用以下两个函数实现:
(1)第一种方法
struct node
{
int value;
int index;
};
bool cmp(struct node a, struct node b)
{
if (a.value < b.value)
{
return true;
}
return false;
}
template <typename T>
T sort_indexes(vector<size_t> &idx, vector<T> &v)
{
node* a = new node[v.size()];
for (int i = 0; i < v.size(); i++)
{
a[i].value = v[i];
a[i].index = i;
}
std::sort(a, a + v.size(), cmp);
for (int i = 0; i < v.size(); i++)
{
idx.push_back(a[i].index);
}
delete[] a;
return 0;
}
(2)第二种方法
template <typename T>
vector<size_t> sort_indexes_e(vector<T> &v)
{
vector<size_t> idx(v.size());
iota(idx.begin(), idx.end(), 0);
sort(idx.begin(), idx.end(),
[&v](size_t i1, size_t i2) {return v[i1] < v[i2]; });
return idx;
}