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