c++ - 根据某一行对整个二维 vector 进行排序

标签 c++ sorting vector

我有兴趣根据第二行对整个二维 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/

相关文章:

c++ - 在另一个线程未定义行为的破坏调用期间调用对象上的方法吗?

c++ - 使用二维数组读取 csv 文件

c++ - "Dynamic"if语句c++

r - 在 R 中按特定顺序对数据进行排序

javascript - 按键对对象数组进行排序

c++ - 计算 vector 中单词的出现次数

c++ - 如何在 C++ 中将质因子 vector<int> 减少到 map<int,int>?

c++ - 对此(希望)100% 安全的双重检查锁定替代单例的任何评论

c# - 是否有可能在 C# 中提供 IComparer 实现并以某种方式在运行时将其 "compiled"放入应用程序中?

r - 如何将两个相同长度的向量合并为一个在R中也具有相同长度的向量