fill颜色填充c语言,c – 使用std :: fill填充多维数组的安全方法...

初始化为0的简单方法是在定义中:

char flags[26][80] = {};

如果你想使用std :: fill,或者你想重置数组,我发现这更好一点:

char flags[26][80];

std::fill( &flags[0][0], &flags[0][0] + sizeof(flags) /* / sizeof(flags[0][0]) */, 0 );

以数组大小表示的填充将允许您更改尺寸并保持填充不变. sizeof(flags [0] [0])在你的情况下是1(sizeof(char)== 1),但你可能想留在那里,以防你想在任何时候改变类型.

在这种特殊情况下(标志数组 – 整数类型)我甚至可以考虑使用memset,即使它是最安全的替代方案(如果数组类型更改为非pod类型,这将会中断):

memset( &flags[0][0], 0, sizeof(flags) );

请注意,在所有三种情况下,数组大小只键入一次,编译器推断其余部分.这有点安全,因为它为程序员错误留下了更少的空间(在一个地方改变大小,在其他地方忘记它).

编辑:你已经更新了代码,因为它不会编译,因为数组是私有的,你试图在外部初始化它.根据您的类实际上是一个聚合(并希望保持这样)或者是否要向该类添加构造函数,您可以使用不同的方法.

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;

}

即使数组是公开的,使用构造函数可能是更好的方法,因为它将保证数组在类的所有实例中正确初始化,而外部初始化依赖于用户代码而不忘记设置初始值.

[1]正如@Oli Charlesworth在一篇评论中所提到的,使用常数对于必须在多个地方陈述(并保持同步)大小的问题是不同的解决方案.我在这里使用了一种不同的组合:通过请求第一列的地址超出二维数组,可以获得指向二维数组外部的第一个字节的指针.我使用这种方法只是为了表明它可以完成,但它并没有比其他像& array [0] [0](rows * cols)更好的方法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值