使用vector<vector<int>> c ++按它们的总和对二维矩阵进行排序?

Posted

技术标签:

【中文标题】使用vector<vector<int>> c ++按它们的总和对二维矩阵进行排序?【英文标题】:Sorting a 2d matrix by their sum using vector<vector<int>> c++? 【发布时间】:2020-04-18 18:19:28 【问题描述】:

我是向量矩阵的新手。

C++ 和使用向量>拜托!

cin >> n >> m;

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

    for (auto& rows : A)
        for (auto& x : rows)
            cin >> x;



    sort(A.begin(), A.end());

不过我的排序不好。谢谢!

【问题讨论】:

您需要为您的sort() 实现一个自定义比较函数,该函数将两个向量的总和进行比较。有关将自定义比较器与 C++ 库的容器和算法一起使用的示例,请参阅 C++ 教科书。 @SamVarshavchik 我只需要那个函数来积累它们。 @Mogovan,看看en.cppreference.com/w/cpp/algorithm/sort,第三个构造函数。您想实现自定义比较功能。 std::vector 的默认比较按字典顺序比较它们,因此您需要覆盖它。 @JohnFilleau 我现在要做一个函数,我试过但它不起作用,如果你只帮助我```` 函数```` 会很有帮助的。谢谢 【参考方案1】:

要么使用标头&lt;numeric&gt; 中声明的标准算法std::accumulate 和使用该算法并将传递给标准算法std::sort 的lambda 表达式,要么自己编写类似的函数。

以下是实现这两种方法的两个演示程序。

#include <iostream>
#include <iomanip>
#include <vector>
#include <iterator>
#include <algorithm>
#include <numeric>
#include <cstdlib>
#include <ctime>

int main() 

    size_t n = 0, m = 0;

    std::cin >> n >> m;

    std::vector<std::vector<int>> v( n, std::vector<int>( m ) );

    std::srand( ( unsigned int )std::time( nullptr ) );

    for ( auto &row : v )
    
        for ( auto &item : row )
        
            item = std::rand() % ( n * m );
        
    

    for ( const auto &row : v )
    
        for ( const auto &item : row )
        
            std::cout << std::setw( 2 ) << item << ' ';
        
        std::cout << '\n';
    

    std::cout << '\n';

    auto less = []( const auto &row1, const auto &row2 )
    
        return std::accumulate( std::begin( row1 ), std::end( row1 ), 0ll ) <
               std::accumulate( std::begin( row2 ), std::end( row2 ), 0ll );
    ;

    std::sort( std::begin( v ), std::end( v ), less );

    for ( const auto &row : v )
    
        for ( const auto &item : row )
        
            std::cout << std::setw( 2 ) << item << ' ';
        
        std::cout << '\n';
    

    std::cout << '\n';

    return 0;

#include <iostream>
#include <iomanip>
#include <vector>
#include <iterator>
#include <algorithm>
#include <cstdlib>
#include <ctime>

long long int accumulate( const std::vector<int> &v, long long int init = 0 )

    for ( const auto &item : v ) init += item;

    return init;


bool less( const std::vector<int> &v1, const std::vector<int> &v2 )

    return accumulate( v1 ) < accumulate( v2 );


int main() 

    size_t n = 0, m = 0;

    std::cin >> n >> m;

    std::vector<std::vector<int>> v( n, std::vector<int>( m ) );

    std::srand( ( unsigned int )std::time( nullptr ) );

    for ( auto &row : v )
    
        for ( auto &item : row )
        
            item = std::rand() % ( n * m );
        
    

    for ( const auto &row : v )
    
        for ( const auto &item : row )
        
            std::cout << std::setw( 2 ) << item << ' ';
        
        std::cout << '\n';
    

    std::cout << '\n';

    std::sort( std::begin( v ), std::end( v ), less );

    for ( const auto &row : v )
    
        for ( const auto &item : row )
        
            std::cout << std::setw( 2 ) << item << ' ';
        
        std::cout << '\n';
    

    std::cout << '\n';

    return 0;

如果输入的向量大小等于34,则输出可能如下所示

 3  3  1  4 
 6  1  5  7 
 5  6  7  2 

 3  3  1  4 
 6  1  5  7 
 5  6  7  2 

【讨论】:

以上是关于使用vector<vector<int>> c ++按它们的总和对二维矩阵进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用vector<vector<int>>找到严格高于矩阵次对角线的元素之和?

mfc c++ 初学,vector怎么最简单地使用二维数组vector<int,int> vec;

如何使用循环将向量推入 queue<vector<int>>?

vector<vector<int>>vec1 和 vector<int>vec2[100] 有啥区别? [关闭]

如何在 C++ 中将输入正确读入 2D 向量 vector<vector<int>>

vector < vector < int >> 在第一维上的点积