背景:
今天作者在用到布尔数组时,想让其初始化的时候里面的值全为true(其实不用那么较真),而由此引发了一系列的问题。(建议还是转换到用vector好很多)因此写文记录一下,希望能帮助到许多入门的小伙伴。如果觉得有帮助就点个赞吧,写了那么多文章一个赞都没有,哭了///
问题描述
其实一共引发了三个问题:
1、定义的数组长度不可为变量(报错:表达式必须含有常量值) 2、由变量定义的动态数组如何直接全体初始化? 3、能不能使用c++的优势达到想要的结果(int bool数组用vector、char数组用string)
原因一分析:
让我们先分析第一个原因: 1、也许有人发现了,为何下面的代码力扣上就可以由变量定义数组长度,而自己的VS上就不行
void setZeroes(vector<vector<int>>& matrix) {
int row = matrix.size();
int column = matrix[0].size();
bool flag_r[row];
bool flag_c[column];
这其实是因为因为DEV-C++使用的编译器是GCC,它允许使用变量作为数组的长度定义数组。而VC的编译器不是GCC,它不允许这样做。
原因一解决方案:
但是有时我们需要根据输入定义数组的大小。因此,这里就需要用到c++的动态分配了。其实就是使用new关键字,定义步骤如下:
void init_arr(vector<vector<int>>& matrix)
{
int row = matrix.size();
int* array = new int[row];
但是用完之后,一定要记得释放!!
delete[] array;
array = NULL;
原因二解决方案:
其实一共有两个解决方法,一个是直接暴力for,第二个是fill函数。此处只介绍fill函数的方法。 如下例中输入函数的矩阵是一个shape为10*10:
void init_arr(vector<vector<int>>& matrix)
{
int row = matrix.size();
int column = matrix[0].size();
int* array = new int[row];
fill(array, array+row, 8);
delete[] array;
array = NULL;
}
原因三解决方案:
常量定义的数组很常规也很简单,此处不做过多阐述。而作者更像说明的是,我们能不能别搞那么复杂,更简单地解决问题。
其实布尔数组就是01数组,这个甚至可以用整型数组来代替。因此,数组用vector代替,字符组用string代替。下面可以直接做一个全是true的row长度的数组。(这里代码给全,大家可以自己去test)
#include <iostream>
#include <vector>
using namespace std;
void init_arr(vector<vector<int>>& matrix)
{
int row = matrix.size();
int column = matrix[0].size();
vector<int> arr;
arr.resize(row, 1);
for (auto it = arr.begin(); it != arr.end(); it++) cout << *it << endl;
}
int main()
{
vector<vector<int>>matrix(10);
matrix[0].resize(10, 0);
init_arr(matrix);
return 0;
}
所以,多定义vector数组吧,当然如果遇到二维多维的问题,可以去看我上一篇文章。搞懂了三维等更多维也可以很轻松定义解决!!
|