具有唯一枚举键和随机值的C ++容器

时间:2018-11-15 19:31:12

标签: c++

我正在为C ++中的多人游戏编写客户端和服务器扩展。 在客户端,我添加了修改内存中车辆数据结构的支持,我想在服务器端使用它,以允许管理员为玩家更改此数据。 我需要考虑的是,玩家可以在修改车辆后加入游戏,因此我需要存储一些已完成更改的列表/队列。我可以按原样发送整个车辆的数据结构,但是它很大,并且会产生巨大的开销,因为它主要是几个被修改的数据条目,例如最大速度等。这些条目可以在其中多次修改。脚本,但我只想保留最近进行的修改。

因此,我需要一种容器,该容器可以让我为脚本的唯一键存储脚本已修改的值。键将来自脚本使用的枚举器。 枚举看起来像这样

enum eVehicleData
{
    VEH_MAX_SPEED,
    VEH_ACCELERATION,
    // etc
}

问题还在于,根据其枚举值,这些值可以具有不同的类型,例如VEH_MAX_SPEED将是浮点值,而VEH_GEAR_COUNT将是整数(或字节等)。

我如何实现这样的目标?我一直在阅读std :: set和std :: pair,但是我认为我不能真正使用std :: set来进行排序,因此我的值必须始终为始终值,无论是较小还是较大。我可以简单地查找一些向量,并检查该键是否存在循环或使用过的键及其索引的另一个容器,但是我不知道该如何解决多类型问题,因为值数据类型可能是对于不同的键来说是不同的,读取数据时我还需要知道类型,以便知道如何处理它。

我不知道自己是否正确表达了自己的意思,所以我将展示一个简单的伪代码示例

uniqueSet<eVehicleData, random_data_type> modifiedKeys;

setVehicleData(veh, VEH_MAX_SPEED, 200.0);
// now modifiedKeys contains [ [VEH_MAX_SPEED, 200.0] ]
setVehicleData(veh, VEH_MAX_SPEED, 190.0);
// now modifiedKeys contains [ [VEH_MAX_SPEED, 190.0] ]
setVehicleData(veh, VEH_GEAR_COUNT, 6);
// now modifiedKeys contains [ [VEH_MAX_SPEED, 190.0], [VEH_GEAR_COUNT, 6] ]

我不在乎任何排序,排序或其他任何内容。

1 个答案:

答案 0 :(得分:1)

您可以结合使用std::mapstd::variant

std::map<eVehicleData, std::variant<int, float>> modifiedKeys;

此结构将eVehicleData s作为,将int s / float s作为。可以使用[]运算符访问映射,并且该映射强制其键的唯一性。这应该符合您期望的行为:

modifiedKeys[VEH_MAX_SPEED] = 200.0f;
// now modifiedKeys contains [ [VEH_MAX_SPEED, 200.0] ]
modifiedKeys[VEH_MAX_SPEED] = 190.0f;
// now modifiedKeys contains [ [VEH_MAX_SPEED, 190.0] ]
modifiedKeys[VEH_GEAR_COUNT] = 6;
// now modifiedKeys contains [ [VEH_MAX_SPEED, 190.0], [VEH_GEAR_COUNT, 6] ]

稍后,当序列化修改后的密钥时,可以使用std::variant检查每个std::get_if的类型:

for (auto & pair : modifiedKeys)
{
    eVehicleData key = pair.first;
    cout << "For key " << key << " we have value ";

    if (int * ivalue = std::get_if<int>(&pair.second))
    {
        // Serialize as int
        cout << *ivalue << endl;
    }
    else if (float * fvalue = std::get_if<float>(&pair.second))
    {
        // Serialize as float
        cout << *fvalue << endl;
    }
}

输出:

For key 0 we have value 190
For key 2 we have value 6