C++布尔数组初始化

6

我想将我的二维布尔数组中的所有元素初始化为false。

size_t n, m;
cin >> n >> m;
bool arr[n][m] = {false};
for(size_t i = 0; i < n; i++){
    for(size_t j = 0; j < m; j++){
        cout << arr[i][j] << " ";
    }
    cout << endl;
}

但是我对输出结果感到非常困惑。例如,如果 n = 5 并且 m = 5,我会得到以下结果:

0 27 64 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

那么,这段代码有什么问题呢?

9
C++不支持可变长度数组。您应该查阅文档,了解您的编译器使用的任何非标准扩展。 - Revolver_Ocelot
谢谢!现在我明白了。 - False Promise
使用向量。std::vector<std::vector<bool>> vec(n, std::vector<bool>(m,false)); - A. Sarid
@A.Sarid vector<bool>存在问题,许多人建议不要使用它。 - M.M
vector<bool> 不应该被推荐,因为它是一个设计失败,请参考:https://isocpp.org/blog/2012/11/on-vectorbool - user2286810
显示剩余3条评论
4个回答

14
#include <iostream>

template<int N>
void print(bool x[N][N] )
{
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<N;j++)
            std::cout << x[i][j] << " ";
        std::cout << "\n";
    }
    std::cout << "\n\n";
};

int main()
{
    bool a[10][10];
    bool b[10][10]{};


    print(a);
    print(b);

  return 0;
}

打印:

./main 
120 29 96 0 0 0 0 0 131 10 
64 0 0 0 0 0 168 161 188 139 
4 127 0 0 255 255 0 0 1 0 
0 0 0 176 40 152 253 127 0 0 
153 10 64 0 0 0 0 0 2 0 
0 0 0 0 0 0 221 11 64 0 
0 0 0 0 65 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
144 11 64 0 0 0 0 0 160 8 
64 0 0 0 0 0 32 177 40 152 


0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 

6

使用for结构初始化值,就像打印它一样

     bool arr[n][m]; 
     for(std::size_t i = 0; i < n; i++){
         for(std::size_t j = 0; j < m; j++){
             arr[i][j]=false;
         }
     }

编辑使用 std::size_t(C++类型)代替 size_t(C类型),这是在C++中更好的实践方法(请参见https://dev59.com/TG025IYBdhLWcg3wwY34)。 - Kukuster

0

第一件事:你的代码在我的gcc编译器中运行正常。我不知道为什么你会出错。

C语言有一个规则,即所有静态存储期对象(由程序员未显式初始化的)必须设置为零。

静态存储期的意义是:

具有静态存储期的对象在整个程序执行期间都驻留在同一内存地址中。

因此,例如声明arr[n][m] = {-1}只将第一个元素设置为“-1”,其他元素默认为零。即使如此,将arr[n][m] = 0设置为坏的编程风格。

更好的替代方法是使用cstring的函数memset: memset(arr, samp, sizeof(arr[0][0]) * m * n);将arr初始化为samp。 在您的情况下,samp=0。

更新:

正如Martin所述,最好不要使用多维数组的memset。另一种选择是使用std:fill: std::fill(arr[0], arr[0] + m * n, samp);

在C语言中可能不可能,但在C++中是可能的。


memset 应该附带严重警告。它适用于填充整数类型,但对于指针和浮点数则不适用void *p; memset(&p, 0, sizeof(p)); p==nullptr; 是未定义行为。实际上,我不知道任何当前平台无法使用的情况,但我曾经使用过会崩溃的平台。换句话说:p=0 可能意味着“将 p 设置为空指针”,但这并不意味着空指针所有位都是零。 - Martin Bonner supports Monica

0

从字符串初始化布尔数组

跳过这个问题,我提供了一个解决方案,可以通过一个字符串来初始化布尔数组。因此,'0'=false'1'=true' '=只是一个间隔符。这类似于位集合构造函数的工作方式。

代码

#include <iostream>

/**
 * Fills boolean array based on a simple string
 *
 * @param[out] boolean array to be filled
 * @param[in] str accepts only 0 (false), 1 (true) and space (seperator) chars in string
 * @param[in] nMax maximum number of elements to write, -1 is infinite
 * @returns number of writen boolen elements
 */
size_t boolArray_from_string(bool *boolArray, const std::string str, const int nMax = -1)
{
    size_t size = str.size();
    size_t n = 0;
    int cc;
    for (cc = 0; cc < size; cc++)
    {
        if (str.at(cc) == ' ') {continue;}
        if (str.at(cc) != '0' && str.at(cc) != '1') 
        {
            throw std::invalid_argument("str must contain only 0s, 1s and spaces.");
        }
        if (n == nMax)
        {
            throw std::invalid_argument("nMax too small for str content.");
        }

        if (str.at(cc) == '0')
        {
            boolArray[n] = false;
        }
        else
        {
            boolArray[n] = true;
        }
        n++;
    }
    return cc;
}

void print(bool *x, int nRows, int nCols)
{
    for(int row=0; row<nRows; row++)
    {
        for(int col=0; col<nCols; col++)
        {
            std::cout << x[row * nCols + col] << " ";
        }
        std::cout << "\n";
    }
    std::cout << "\n\n";
};

int main()
{
    bool falseArr[3][5];
    boolArray_from_string(&falseArr[0][0], std::string(15, '0'), -1);
    print(&falseArr[0][0], 3, 5);

    bool custArr[3][5];
    boolArray_from_string(&custArr[0][0], "01011 00111 11111", -1);
    print(&custArr[0][0], 3, 5);
}

输出

0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 


0 1 0 1 1 
0 0 1 1 1 
1 1 1 1 1 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接