使用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】:
要么使用标头<numeric>
中声明的标准算法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;
如果输入的向量大小等于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
【讨论】:
以上是关于使用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] 有啥区别? [关闭]