Codewar一些积累No.2 从矩阵的加法体会vector的用法

本文探讨了在C++中实现矩阵加法的过程,详细介绍了如何使用std::vector表示矩阵,以及如何遍历和操作矩阵中的元素。通过具体示例,展示了如何正确地将两个矩阵相加,并分享了在开发过程中的常见陷阱和解决方法。

用代码实现矩阵加法问题

最近在Codewar上看到一个有趣的问题是关于矩阵的加法问题.
题目中, 我所要编写的函数的传入参数是两个向量, 而且此向量是嵌套的, 具体内容如下:

std::vector<std::vector<int> > matrixAddition(std::vector<std::vector<int> > a,std::vector<std::vector<int> > b)

可以发现传入参数的形式:

std::vector<std::vector<int>> a

利用了两层vector来实现矩阵的表示. 由于本人萌新,对于vector类的操作不熟悉, 所以为了研究如何对其操作, 又是一次头秃的经历…

先看题目的内容

要求

Write a function that accepts two square matrices (N x N two dimensional arrays), and return the sum of the two. Both matrices being passed into the function will be of size N x N (square), containing only integers.

How to sum two matrices:

Take each cell [n][m] from the first matrix, and add it with the same [n][m] cell from the second matrix. This will be cell [n][m] of the solution matrix.

样例

matrixAddition(
[ [1, 2, 3],
[3, 2, 1],
[1, 1, 1] ],
// +
[ [2, 2, 1],
[3, 2, 3],
[1, 1, 3] ] )

// returns:
[ [3, 4, 4],
[6, 4, 4],
[2, 2, 4] ]

我的头秃探索中…

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<vector<int>> a = {{1,2,3},{4,5,6},{7,8,9}};
	cout << a.size() << endl;   //通过.size来测两数组大小(这里可以理解为矩阵有多少列)
	return 0;
}

这里显示的结果就是3,就是显示矩阵有多少列;
那如何实现看矩阵有多少行呢?

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<vector<int>> a = {{1,2,3},{4,5,6,7},{8,9,0}};
    cout << a[1].size() << endl;
}

我们可以发现, 我们可以用下标来表示vector中的vector, 这里第二行有四个元素,可以说不是矩阵了, 但为了方便演示区分, 这样写. 可以看出输出值为4,说明第二行有四个元素.
而我们要如何把这个二维数组中的每个元素遍历出来呢?

自己懒得打了: 引用一下大佬的文章

1.通过下标方式获取

int a[6]={1,2,3,4,5,6};
vector<int>b(a,a+4);
for(int i=0;i<=b.size()-1;++i){cout<<b[i]<<endl;}

2.通过迭代器方式读取

 int a[6]={1,2,3,4,5,6};
 vector<int>b(a,a+4);
 for(vector<int>::iterator it=b.begin();it!=b.end();it++){cout<<*it<<"  ";}
————————————————
版权声明:本文为优快云博主「刘同学_0116」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41743247/article/details/90635931

而对于二维数组,则可以用嵌套的for循环+二重下标实现.这里不用过多阐释.

不过大佬还说了一点也值得注意,就是vector下标只能访问已经存在的元素
也就是说,但vector里面还没有初值的时候: 如下例:

    vector<int>a ;
    for(int i=0;i<10;++i)
    	a[i]=i;
    cout << a[5] << endl;

程序的编译不会报错,但程序最终会无法执行(再次感受到C++深深的恶意)
如果要成功的话,可以使用初始化:

    vector<int>a(10,0); //初始化为10个元素,每个元素的值为0
    for(int i=0;i<10;++i)
    	a[i]=i;
    cout << a[5] << endl;

了解了这些,对于解决矩阵加法之类的问题基本上就够用了
之后关于vector的操作可以放在以后的文章中写;

现在就是开始解决问题了

不过有一个疑问没有解决:

std::vector<std::vector<int> > matrixAddition(std::vector<std::vector<int> > a,std::vector<std::vector<int> > b){
  int n = a.size();
  std::vector<std::vector<int>> result;
  for ( int i = 0 ; i < n ; i++ )
    {
      for ( int j = 0 ; j < n ; j++ )
      {
        result[i].push_back( a[i][j] + b[i][j] );
      }
    }
  return result;
  // your code here
}

我这样做貌似是不可以的,不知道是出现啦什么问题;
等待大佬帮忙解答

那就换一个思路:

std::vector<std::vector<int> > matrixAddition(std::vector<std::vector<int> > a,std::vector<std::vector<int> > b){
  int n = a.size();
  std::vector<std::vector<int>> result(n,std::vector<int>(n,0)); 
  //直接利用初始化,初始这个数组(不过这个初始化也很有意思,你品,你细品)
  for ( int i = 0 ; i < n ; i++ )
    {
      for ( int j = 0 ; j < n ; j++ )
      {
        result[i][j] = a[i][j] + b[i][j] ;
      }
    }
  return result;
  // your code here
}

最后就是喜闻乐见的测试通过啦.

结尾

大概今天的刷题体验就是这样了,虽然没有为大家整理什么系统的知识(系统知识完全可以看刘同学大佬啊喂!) 不过如果大家能与我一起每天一刷,应该还是对大家的实战水平有所帮助吧…(没有底气)
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值