C ++在向量向量

时间:2017-03-16 07:27:46

标签: c++ sorting vector

我尝试使用嵌套向量对多个列进行排序,但我不确定如何实际执行此操作。 我在这里搜索了很多帖子,但他们只展示了如何排序到两列,我知道排序一列如下:

sort(myVector.begin(), myVector.end(), [](vector<int> const a, vector<int> const b){return a[0] < b[0];});

我有一个输入,用户输入向量的大小并相应地生成,我希望能够对输出中的每一列进行排序。

例如:

未排序

{3, 7, 2}

{9, 6, 8}

{5, 1, 4}

排序

{3, 1, 2}

{5, 6, 4}

{9, 7, 8}

1 个答案:

答案 0 :(得分:3)

这是线性代数库中的经典之作:由于元素访问模式,给定矩阵的布局会影响很多性能。

你面对完全相同的结果。显然,int的每个向量都是一个行。您需要对列进行排序。你可以做的是转置技巧:

  1. 计算矩阵的转置
  2. 对该转置的行进行排序
  3. 计算此已排序矩阵的转置
  4. 利润
  5. 一些代码来说明这个想法:

    std::vector<std::vector<int>> transpose(std::vector<std::vector<int>> const& input) {
        // For simplicity, I assume input is well formed, i.e.:
        //  - All int vectors have the same size
        //  - input is non-empty.
        std::vector<std::vector<int>> tr_input;
        for(std::size_t i = 0; i < input.front().size(); ++i) {
            std::vector<int> tmp;
            for (auto& vec : input) {
                tmp.push_back(vec.at(i));
            }
            tr_input.push_back(tmp);
        }
        return tr_input;
    }
    

    现在我们有转置功能,我们可以实现算法。

    std::vector<std::vector<int>> input = { { 3, 7, 2 },
                                            { 9, 6, 8 },
                                            { 5, 1, 4 } };
    auto tr = transpose(input);
    for (auto& v : tr) {
        std::sort(v.begin(), v.end());
    }
    auto sorted = transpose(tr);
    

    可以在此Live Demo

    上查看结果