Tru*_*eon 12 c++ fill multidimensional-array
这是我正在使用的:
class something
{
char flags[26][80];
} a;
std::fill(&a.flags[0][0], &a.flags[0][0]+26*80, 0);
Run Code Online (Sandbox Code Playgroud)
(更新:我之前应该已经明确表示我正在课堂上使用它.)
Dav*_*eas 21
初始化为0数组的简单方法是在定义中:
char flags[26][80] = {};
Run Code Online (Sandbox Code Playgroud)
如果你想使用std::fill,或者你想重置数组,我发现这更好一点:
char flags[26][80];
std::fill( &flags[0][0], &flags[0][0] + sizeof(flags) /* / sizeof(flags[0][0]) */, 0 );
Run Code Online (Sandbox Code Playgroud)
将fill在阵列尺寸方面将允许您更改尺寸,并保持表达fill不变.该sizeof(flags[0][0])是1你的情况(sizeof(char)==1),但你可能想在那里把它留在你想在任何时候更改类型案件.
在这种特殊情况下(标志数组 - 整数类型)我甚至可以考虑使用memset它,即使它是最不安全的替代方案(如果数组类型更改为非pod类型,这将会中断):
memset( &flags[0][0], 0, sizeof(flags) );
Run Code Online (Sandbox Code Playgroud)
请注意,在所有三种情况下,数组大小只键入一次,编译器推断其余部分.这有点安全,因为它为程序员错误留下了更少的空间(在一个地方改变大小,在其他地方忘记它).
编辑:你已经更新了代码,因为它不会编译,因为数组是私有的,你试图在外部初始化它.根据您的类实际上是一个聚合(并希望保持这样)或者是否要向该类添加构造函数,您可以使用不同的方法.
const std::size_t rows = 26;
const std::size_t cols = 80;
struct Aggregate {
char array[rows][cols];
};
class Constructor {
public:
Constructor() {
std::fill( &array[0][0], &array[rows][0], 0 ); // [1]
// memset( array, 0, sizeof(array) );
}
private:
char array[rows][cols];
};
int main() {
Aggregate a = {};
Constructor b;
}
Run Code Online (Sandbox Code Playgroud)
即使它array是公开的,使用构造函数可能是一种更好的方法,因为它将保证array在类的所有实例中正确初始化,而外部初始化依赖于用户代码而不忘记设置初始值.
[1]正如@Oli Charlesworth在一篇评论中所提到的,使用常数对于必须在多个地方陈述(并保持同步)大小的问题是不同的解决方案.我在这里使用了一种不同的组合:通过请求第一列的地址超出二维数组,可以获得指向二维数组外部的第一个字节的指针.我使用这种方法只是为了表明它可以完成,但它并没有比其他人更好&array[0][0]+(rows*cols)
使用 填充多维数组的安全方法是什么
std::fill?
简单的默认初始化是使用花括号初始化。
char flags[26][80]{};
Run Code Online (Sandbox Code Playgroud)
上面的代码会将 char 中的所有元素初始化为flags默认字符。
std::fill使用或填充二维数组std::fill_n然而,为了提供不同的值来初始化上述还不够。选项是std::fill和std::fill_n。(假设数组flags在public你的类中)
std::fill(
&a.flags[0][0],
&a.flags[0][0] + sizeof(a.flags) / sizeof(a.flags[0][0]),
'0');
// or using `std::fill_n`
// std::fill_n(&a.flags[0][0], sizeof(a.flags) / sizeof(a.flags[0][0]), '1');
Run Code Online (Sandbox Code Playgroud)
为了将其推广到具有任何初始化值的任何类型的任何二维数组,我建议使用如下的模板化函数。这也将避免sizeof计算数组中的总元素。
#include <algorithm> // std::fill_n, std::fill
#include <cstddef> // std::size_t
template<typename Type, std::size_t M, std::size_t N>
constexpr void fill_2D_array(Type(&arr2D)[M][N], const Type val = Type{}) noexcept
{
std::fill_n(&arr2D[0][0], M * N, val);
// or using std::fill
// std::fill(&arr2D[0][0], &arr2D[0][0] + (M * N ), val);
}
Run Code Online (Sandbox Code Playgroud)
现在你可以初始化你的flags喜欢
fill_2D_array(a.flags, '0'); // flags should be `public` in your class!
Run Code Online (Sandbox Code Playgroud)
(参见在线直播)
std::fill使用或填充 3-D 数组std::fill_n在上面的模板函数中添加一个非模板大小参数,这也可以应用于3d-array s
#include <algorithm> // std::fill_n
#include <cstddef> // std::size_t
template<typename Type, std::size_t M, std::size_t N, std::size_t O>
constexpr void fill_3D_array(Type(&arr3D)[M][N][O], const Type val = Type{}) noexcept
{
std::fill_n(&arr3D[0][0][0], M * N * O, val);
}
Run Code Online (Sandbox Code Playgroud)
(参见在线直播)