我有兴趣根据第二行对整个二维 vector 进行排序。我尝试了一些只对第二行进行排序的代码,但是,我想要它用于整个二维 vector 。
#include<iostream>
#include<vector>
#include<algorithm>
int main()
{
std::vector< std::vector<int> > vect{{3, 5, 1},
{4, 8, 6},
{7, 2, 9}};
int m = vect.size();
int n = vect[0].size();
sort(vect[1].begin(), vect[1].end());
std::cout << "After sorting :\n";
for (int i=0; i<m; i++)
{
for (int j=0; j<n ;j++)
std::cout << vect[i][j] << " ";
std::cout << std::endl;
}
return 0;
}
输出如下:
3 5 1
4 6 8
7 2 9
但我希望它是
3 1 5
4 6 8
7 9 2
最佳答案
创建一个转置 vector 的函数,因此它应该将 {{3, 5, 1}, {4, 8, 6}, {7, 2, 9}} 修改为 {{3,4,7}, {5,8,2},{1,6,9}}。使用您的函数转置 vector ,然后使用自定义比较器比较行的第二个元素对 vector 进行排序。然后再次调用转置函数。
转置函数看起来像
std::vector< std::vector<int> > transpose(std::vector< std::vector<int> >& vect)
{
std::vector< std::vector<int> > transposed(vect[0].size(), std::vector<int>());
for (size_t i = 0; i < vect.size(); ++i)
for (size_t j = 0; j < vect[0].size(); ++j)
transposed[j].push_back(vect[i][j]);
return transposed;
}
那么整个代码就是
vect = transpose(vect);
std::sort(vect.begin(), vect.end(),
[](const std::vector<int>& lhs, const std::vector<int>& rhs)
{return lhs[1] < rhs[1];});
vect = transpose(vect);
如果 vector 是正方形,则可以就地进行转置,使解决方案比一般解决方案更有效。
关于c++ - 根据某一行对整个二维 vector 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41778699/