如何对二维向量的列进行排序?[关闭]

How to sort the column of a 2d vector? [closed]

提问人:Mogovan Jonathan 提问时间:5/1/2020 最后编辑:Mogovan Jonathan 更新时间:5/2/2020 访问量:413

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

3年前关闭。

每列都需要排序,例如,对于以下输入:

3 //3 by 3 matrix

2 3 4
34 3 1
4 54 2

输出应为

2 3 1
4 3 2 
34 54 4

这是我的代码:


    cin >> n;

    vector<vector<int>> A(n, vector<int>(n));

    for (auto &row : A)
        for (auto &el : row)
            cin >> el;

    for (int i = 0; i < n; i++)
        sort(A.begin(), A.end(), [&](vector<int>& l, vector<int>& j) {
            return (l[i] < j[i]); 
            });

    for (auto row : A)
    {
        for (auto el : row)
            cout << el << " ";
        cout << "\n";
    }

我的代码的问题在于它对一些列进行了排序,但不是全部。请帮我修复它

如果我输入上面的第一个示例,我的输出是:

34 3 1
4 54 2
2 3 4

仅对最后一列进行排序

C++ 矩阵 向量

评论

1赞 mkrieger1 5/1/2020
如何调试小程序
0赞 5/1/2020
你正在让事情变得比你自己需要的更难。a 是数组的数组。它不在乎它的更高层次的含义是什么。如果你有一个列向量而不是行向量,那就容易多了。vector<vector<int>>
1赞 Mogovan Jonathan 5/1/2020
@Frank请举例说明
3赞 PaulMcKenzie 5/1/2020
@MogovanJonathan -- 问题在于该循环的每次迭代都会扰乱前一个排序列。至少,你应该已经看到这一点并在你的帖子中提到它,或者注意到它并想出另一个设计。你必须改变你对 a 意味着什么的表示。vector<vector<int>>

答:

1赞 PaulMcKenzie 5/1/2020 #1

问题在于,对于循环的每次迭代,都可能会更改已排序的列。forstd::sort

例如,如果对列进行排序,则列 、 等可能会丢失为对这些列进行排序所做的更改。ii-1i-2

在不更改太多原始代码的情况下,尽管这不是最有效的方法,但您可以创建一个辅助代码,并将循环中每次迭代的排序列结果保存在辅助向量中。std::vector<std::vector<int>>

完成循环后,将辅助向量分配回原始向量。

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

std::vector<std::vector<int>> A = {{2, 3, 4}, {34, 3, 1}, {4, 54, 2}};

int main()
{
    if ( !A.empty() && !A[0].empty() )
    {
        auto auxV = A; // The auxiliary vector<vector>

        for (size_t i = 0; i < A[0].size(); i++)
        {
            // Sort column i
            std::sort(A.begin(), A.end(), [&](vector<int>& l, vector<int>& j) {
                return (l[i] < j[i]); 
                });

            // Save the results of the sort of column i in the auxiliary vector  
            for (size_t j = 0; j < A.size(); ++j)
                auxV[j][i] = A[j][i];
        }
        A = auxV; // copy the results back to the original vector
   }

    // display results
    for (auto& row : A)
    {
        for (auto el : row)
            std::cout << el << " ";
        std::cout << "\n";
    }
}

输出:

2 3 1 
4 3 2 
34 54 4