如何使用memset或fill_n在C++中初始化动态二维数组

Syn*_*ter 6 c++ memset multidimensional-array dynamic-arrays

我有一个动态创建的2D数组.

int **abc = new int*[rows];

for (uint32_t i = 0; i < rows; i++)
{
    abc[i] = new int[cols];
}
Run Code Online (Sandbox Code Playgroud)

我想用一些值填充数组(比如说1).我可以遍历每个项目并执行它.

但是有一种更简单的方法.我正在尝试使用memsetstd::fill_n本文中提到.

std::fill_n(abc, rows * cols, 1);
memset(abc, 1, rows * cols * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

使用memset会崩溃我的程序.使用fill_n会产生编译错误.

invalid conversion from 'int' to 'int*' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

Bar*_*rry 5

你可以使用vector:

std::vector<std::vector<int>> abc(rows, std::vector<int>(cols, 1));
Run Code Online (Sandbox Code Playgroud)

您不能使用std::fill_nmemsetabc直接,这是行不通的.您只能在子数组上使用:

int **abc = new int*[rows];

for (uint32_t i = 0; i < rows; i++)
{
    abc[i] = new int[cols];
    std::fill_n(abc[i], cols, 1);
}
Run Code Online (Sandbox Code Playgroud)

或者使整个事物成为一维的:

int *abc = new int[rows * cols];
std::fill_n(abc, rows*cols, 1);
Run Code Online (Sandbox Code Playgroud)

或者我想你可以std::generate_n结合使用std::fill_n,但这看起来很混乱:

int **abc = new int*[rows];
std::generate_n(abc, rows, [cols]{
    int* row = new int[cols];
    std::fill_n(row, cols, 1);
    return row;
});
Run Code Online (Sandbox Code Playgroud)