提问人:Mogovan Jonathan 提问时间:5/1/2020 最后编辑:Mogovan Jonathan 更新时间:5/2/2020 访问量:413
如何对二维向量的列进行排序?[关闭]
How to sort the column of a 2d vector? [closed]
问:
每列都需要排序,例如,对于以下输入:
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
仅对最后一列进行排序
答:
1赞
PaulMcKenzie
5/1/2020
#1
问题在于,对于循环的每次迭代,都可能会更改已排序的列。for
std::sort
例如,如果对列进行排序,则列 、 等可能会丢失为对这些列进行排序所做的更改。i
i-1
i-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
评论
vector<vector<int>>
vector<vector<int>>