发布日期:2018-03-26
c++排序和索引的记录+ 查看更多
c++排序和索引的记录
+ 查看更多
发布日期:2018-02-26 14:22
分类:CPlusPlus
浏览次数:86
使用C ++,希望是标准库,我想按升序对一系列样本进行排序,而且我也想记住新样本的原始索引。
例如,我有一个集合,或者向量或矩阵的样本:[5、2、1,4,3]。我想把这些排序为B:[1,2,3,4,5],但我也想记住值的原始索引,所以我可以得到另一个集合,它将是:C:[2,1 ,4,3,0] - 其对应于原始“A”中的“B”中的每个元素的索引。
例如,在Matlab你能这样做:
[a,b]=sort([5, 8, 7]) a = 5 7 8 b = 1 3 2
任何人都可以看到一个好的方法做到这一点吗?
回答
使用c++中的希腊字母λ
templatevector sort_indexes(const vector &v) { // initialize original index locations vector idx(v.size()); iota(idx.begin(), idx.end(), 0); // sort indexes based on comparing values in v sort(idx.begin(), idx.end(), [&v](size_t i1, size_t i2) {return v[i1] < v[i2];}); return idx; }
现在你可以使用返回的索引向量进行迭代,例如
for (auto i: sort_indexes(v)) { cout << v[i] << endl; }
显然,你还可以选择提供你自己的原始索引向量,排序函数,比较器,或使用sort_indexes函数中一个额外向量v自动重新排序。