我有一个动态创建的2D数组。
int **abc = new int*[rows];
for (uint32_t i = 0; i < rows; i++)
{
abc[i] = new int[cols];
}
我想用一些值填充数组(比如说1)。我可以遍历每个项目并执行它。
但是有一种更简单的方法。我正在尝试使用this post中提到的memset
和std::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]
我在这里做错了什么?
答案 0 :(得分:5)
您可以使用vector
:
std::vector<std::vector<int>> abc(rows, std::vector<int>(cols, 1));
您无法直接在std::fill_n
上使用memset
或abc
,它根本无效。您只能在子数组上使用:
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_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;
});
答案 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数组的位置,所以你必须仔细编码。