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

Posted

技术标签:

【中文标题】如何使用vector<vector<int>>找到严格高于矩阵次对角线的元素之和?【英文标题】:How to find the sum of the elements strictly above the secondary diagonal of the matrix using vector<vector<int>>? 【发布时间】:2020-04-18 09:43:06 【问题描述】:

如果输入是:

4 
1 6 3 1
6 1 3 1
1 3 1 6
3 1 6 1

我的输出应该是:

18 

1 + 6 + 3 + 6 + 1 + 1 = 18

第二条对角线是从右上角开始到左下角的对角线

       1
     3
   3
 3

我需要找到严格高于第二条对角线的元素的总和。

这是我目前的代码:

int n , sum = 0;
cin >> n;

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

for (auto rows : A)
   for (auto elements : rows)
       cin >> elements;

for(auto x : A) 
   sum += A[x] [n - x];

cout << sum;

我是矩阵向量的新手。另外,如果你们知道我可以在哪里提高我的矢量技能,并更好地理解 stl 矢量,您的建议将非常有帮助!

如果您能帮助我,将不胜感激!

谢谢大家的回答!

【问题讨论】:

我是矩阵向量的新手 -- 使用与使用[][] 的常规二维数组完全相同的语法来检索或设置元素 @PaulMcKenzie 如果你能帮助我编写代码,那将非常有帮助! 输入的第二条对角线是 (1,3,3,3) 而不是 (1,3,3,1) A std::vector&lt;vector&lt;int&gt;&gt; 不仅需要设置行数,还需要设置内部向量的大小。您的代码只做第一件事,而不做第二件事。 @BlueTune 我改了 【参考方案1】:

对于初学者,向量应定义为

vector<vector<int>> A(n, std::vector<int>( n ) );

这些循环应该使用对对象的引用

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

要查找总和,您可以使用索引变量,例如

long long int sum = 0;

for ( auto n = A.size(); n-- != 0;  )

    for ( std::vector<int>::size_type i = 0; i < n; i++ )
    
        sum += A[A.size() - n - 1][i];
    

这是一个演示程序

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>

int main() 

    size_t n = 0;

    std::cout << "Enter the size of a matrix: ";

    std::cin >> n;

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

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

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

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

    long long int sum = 0;

    for ( auto n = v.size(); n-- != 0; )
    
        for ( std::vector<int>::size_type i = 0; i < n; i++ )
        
            sum += v[v.size() - n - 1][i];
        
    

    std::cout << "\nThe sum is equal to " << sum << '\n';

    return 0;

它的输出可能看起来像

Enter the size of a matrix: 5
4 4 0 2 0 
1 4 4 3 3 
3 3 1 0 4 
2 0 2 3 2 
2 1 3 0 3 

The sum is equal to 27

【讨论】:

它有效,但你能解释一下这部分for ( std::vector&lt;int&gt;::size_type i = 0; i &lt; n; i++ ),为什么在for循环中使用向量和size_type。谢谢 @MogovanJonathan: std::vector&lt;int&gt;::size_type 主要只是std::size_t @MogovanJonathan 对于向量的大小,类模板 std::vector 为无符号整数类型引入了一个别名,名为 size_type。这是一个普通的 for 循环。请参阅我的更新答案。 @VladfromMoscow 我接受了你的回答。谢谢!另外,你在哪里学的 vector> ?【参考方案2】:

使用索引:

...
for (int i = 0; i < A.size(); i++)
   for (int j = 0; j < A[i].size() - i; j++)
       sum += A[i][j];
...

【讨论】:

这如何回答这个问题? @ArminMontigny 先阅读问题,然后你就会明白它是如何回答问题的

以上是关于如何使用vector<vector<int>>找到严格高于矩阵次对角线的元素之和?的主要内容,如果未能解决你的问题,请参考以下文章

利用c++中的vector创建动态二维数组

SWIG 如何正确包装 std::vector<double *>

vector内存释放 c++

Vector的Vector如何在内存中对齐?

c++里vector怎么用?

vector 构造函数