测试代码:(对向量进行排序,取一定范围内的数值)
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; } |