初始化枚举 class 类型的二维 std::array (C++11)
Initialize a two-dimensional std::array of type enum class (C++11)
我在 C++11 中有以下 class:
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
有关,但我不知道我应该怎么做才能修复它。
memset()
应该以这种方式工作,因为它是
sets each byte of the destination buffer to the specified value.
在Why is memset() incorrectly initializing int?
中阅读更多内容
但是,要小心,因为正如 juanchopanza 所说,std::array
may have padding at the end (read more in std::array alignment
), 这意味着这种方法可能会失败。
由于它是一个二维数组,您可以使用基于范围的 for 循环和 std::array::fill
,如下所示:
for(auto& row : _table)
row.fill(value);
正如伦佐所说。
如果您不想将每一行设置为相同的值,您当然可以这样做:
for(auto &row : array)
for(auto &col : row)
col = value;
在 range-based for on multi-dimensional array 阅读更多内容。
这可以通过基于范围的 for 循环和 std::array::fill
成员函数来完成。
MyTable(EntryType value)
{
for (auto& row : _table) {
row.fill(value);
}
}
即使您更改数组维度,这也将继续有效。
我在 C++11 中有以下 class:
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
有关,但我不知道我应该怎么做才能修复它。
memset()
应该以这种方式工作,因为它是
sets each byte of the destination buffer to the specified value.
在Why is memset() incorrectly initializing int?
中阅读更多内容但是,要小心,因为正如 juanchopanza 所说,std::array
may have padding at the end (read more in std::array alignment
), 这意味着这种方法可能会失败。
由于它是一个二维数组,您可以使用基于范围的 for 循环和 std::array::fill
,如下所示:
for(auto& row : _table)
row.fill(value);
正如伦佐所说。
如果您不想将每一行设置为相同的值,您当然可以这样做:
for(auto &row : array)
for(auto &col : row)
col = value;
在 range-based for on multi-dimensional array 阅读更多内容。
这可以通过基于范围的 for 循环和 std::array::fill
成员函数来完成。
MyTable(EntryType value)
{
for (auto& row : _table) {
row.fill(value);
}
}
即使您更改数组维度,这也将继续有效。