我在C ++ 11中有以下类:
class MyTable
{
public:
enum class EntryType
{
USED, FREE
};
MyTable(EntryType value)
{
for (uint32_t i = 0; i < 10; ++i)
{
memset(_table[i].data(), (int)value, sizeof(_table[0][0]) * 50);
}
}
array<array<EntryType, 50>, 10> _table;
}
尝试使用EntryType :: FREE的值构造MyTable的对象,二维数组中的每个项的值都为0x01010101(每8位1b),而不是仅为0x1的预期值
我猜这与value
被投放到int
有关,但我不知道为了修复它我应该做些什么。
答案 0 :(得分:6)
memset()
预计会以这种方式运作,因为它是
将目标缓冲区的每个字节设置为指定值。
在Why is memset() incorrectly initializing int?
中了解详情但是,要小心,因为正如juanchopanza所说,std::array
最后可能有填充(在std::array alignment中阅读更多内容
),这意味着这种方法可能会失败。
由于它是一个2D数组,你可以使用基于范围的for循环和std::array::fill
,如下所示:
for(auto& row : _table)
row.fill(value);
如仁佐所说。
如果您不想将每一行设置为相同的值,您当然可以这样做:
for(auto &row : array)
for(auto &col : row)
col = value;
答案 1 :(得分:3)
这可以通过基于范围的for循环和std::array::fill
成员函数来完成。
MyTable(EntryType value)
{
for (auto& row : _table) {
row.fill(value);
}
}
即使您更改了数组尺寸,这仍将继续有效。