【问题标题】:Sorting a 2d matrix by their sum using vector<vector<int>> c++?使用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 我现在要做一个函数,我试过但它不起作用,如果你只帮助我```` 函数```` 会很有帮助的。谢谢

标签: c++ algorithm sorting vector sum


【解决方案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 

【讨论】:

    猜你喜欢
    • 2017-03-16
    • 2015-01-31
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多