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

时间:2016-04-08 18:01:09

标签: c++ multidimensional-array dynamic-arrays memset

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

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

for (uint32_t i = 0; i < rows; i++)
{
    abc[i] = new int[cols];
}

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

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

std::fill_n(abc, rows * cols, 1);
memset(abc, 1, rows * cols * sizeof(int));

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

invalid conversion from 'int' to 'int*' [-fpermissive]

我在这里做错了什么?

3 个答案:

答案 0 :(得分:5)

您可以使用vector

std::vector<std::vector<int>> abc(rows, std::vector<int>(cols, 1));

您无法直接在std::fill_n上使用memsetabc,它根本无效。您只能在子数组上使用:

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);
}

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

int *abc = new int[rows * cols];
std::fill_n(abc, rows*cols, 1);

或者我猜你可以将std::generate_nstd::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;
});

答案 1 :(得分:3)

我认为您的主要问题是您没有int值的数组。你有一个指向int的指针数组。

你可能应该从int* abc = new int[rows * cols];开始,然后在那里工作,如果我理解你想要在这里实现的目标。

答案 2 :(得分:2)

在你已经拥有的循环中使用*:

for (uint32_t i = 0; i < rows; i++)
{
    abc[i] = new int[cols];
    std::fill_n(*(abc+i), cols, sizeof(int));
}

fill_n不知道内存映射新int数组的位置,所以你必须仔细编码。

我建议阅读: A proper way to create a matrix in c++