c++对vector进行排序,并返回索引值

论坛 期权论坛 期权     
匿名技术用户   2021-1-9 22:25   10934   0

测试代码:(对向量进行排序,取一定范围内的数值)

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;
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP