初始化枚举类 (C++11) 类型的二维 std::数组



我在 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有关,但我不知道我应该怎么做才能修复它。

memset()应该以这种方式工作,因为它是

将目标缓冲区的每个字节设置为指定值。

阅读更多 为什么 memset(( 错误地初始化 int?

但是,要小心,因为正如 juanchopanza 所说,std::array末尾可能有填充(在 std::array 对齐中阅读更多内容(,这意味着此方法可能会失败。


由于它是一个 2D 数组,您可以使用基于范围的 for 循环和std::array::fill,如下所示:

for(auto& row : _table)
    row.fill(value);

正如伦佐所说。

如果您不想将每一行都设置为相同的值,当然可以这样做:

for(auto &row : array)
    for(auto &col : row)
         col = value; 

阅读更多基于范围的多维数组。

可以通过基于范围的for循环和std::array::fill成员函数来完成。

MyTable(EntryType value)
{
    for (auto& row : _table) {
        row.fill(value);
    }
}

即使您更改数组尺寸,这也将继续工作。

相关内容

  • 没有找到相关文章

最新更新