我正在为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] ]
我不在乎任何排序,排序或其他任何内容。
答案 0 :(得分:1)
您可以结合使用std::map
和std::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