Я новичок в векторной матрице.

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());

Хотя мой вид не очень хорош. Спасибо!

0
Mogovan Jonathan 18 Апр 2020 в 21:19

1 ответ

Лучший ответ

Либо используйте стандартный алгоритм std::accumulate, объявленный в заголовке <numeric>, и лямбда-выражение, которое использует алгоритм и будет передано стандартному алгоритму std::sort, либо напишите аналогичные функции самостоятельно.

Вот две демонстрационные программы, реализующие оба подхода.

#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;
}

Если ввести размеры векторов, равные 3 и 4, то результат может выглядеть так:

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

 3  3  1  4 
 6  1  5  7 
 5  6  7  2 
2
Vlad from Moscow 18 Апр 2020 в 18:46