加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 创建一个排序向量的向量

发布时间:2020-12-16 03:08:36 所属栏目:百科 来源:网络整理
导读:参见英文答案 c++ sort keeping track of indices4个 变量x是n个int的向量,我想以升序对向量进行排序.但是,由于这个问题范围之外的原因,我想要保持原状.因此,而不是实际排序x的内容,我想创建另一个n个索引向量,其中每个索引引用x中的相应值,如果x被排序. 例
参见英文答案 > c++ sort keeping track of indices4个
变量x是n个int的向量,我想以升序对向量进行排序.但是,由于这个问题范围之外的原因,我想要保持原状.因此,而不是实际排序x的内容,我想创建另一个n个索引向量,其中每个索引引用x中的相应值,如果x被排序.

例如:

std::vector<int> x = {15,3,20};
std::vector<int> y;
// Put the sorted indices of x into the vector y
for (int i = 0; i < 4; i++)
{
    std::cout << y[i];
}

应该输出:

2
1
0
3

对应于x中的值:

0
3
15
20

我可以想到很多及时的实现方法,但是我想知道STL是否有内置的功能可以有效地为我执行这个功能?

解决方法

1)创建y作为索引的向量(整数范围)

2)使用从x返回索引元素的比较器对此范围进行排序
使用标准库,它给出:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {

    std::vector<int> x = {15,20};

    std::vector<int> y;

    std::vector<int> y(x.size());
    std::size_t n(0);
    std::generate(std::begin(y),std::end(y),[&]{ return n++; });

    std::sort(  std::begin(y),[&](int i1,int i2) { return x[i1] < x[i2]; } );

    for (auto v : y)
        std::cout << v << ' ';

    return 0;
}

Live demo.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读