我很好奇以下情况是否安全。修改组内对象的可变成员是否安全?
我有下面的类定义:
class ActiveStatusEffect
{
public:
StatusEffect* effect;
mutable int ReminaingTurns;
ActiveStatusEffect() : ReminaingTurns(0)
{
}
//Other unimportant stuff down here
}
我然后存储一组这些一个std ::里面设置如下:
struct ASECmp
{
bool operator()(const StatusEffects::ActiveStatusEffect &eff1, const StatusEffects::ActiveStatusEffect &eff2)
{
return eff1.effect->GetPriority() < eff2.effect->GetPriority();
}
};
std::set<StatusEffects::ActiveStatusEffect, ASECmp> ActiveStatusEffects;
我标志着作为RemainingTurns可变因为我想能够改变它而不需要不断地擦除/插入集合。即
void BaseCharacter::Tick(Battles::BattleField &field, int ticks)
{
for (auto effect = ActiveStatusEffects.begin(); effect != ActiveStatusEffects.end();)// ++index)
{
auto next = effect;
++next;
if (effect->effect->HasFlag(StatusEffects::STATUS_FLAGS::TickEffect) && effect->ReminaingTurns > 0)
{
effect->effect->TickCharacter(*this, field, ticks);
--effect->ReminaingTurns;
}
if (effect->ReminaingTurns == 0)
{
ActiveStatusEffects.erase(effect);
}
effect = next;
}
}
我很担心,因为它这似乎可能搞乱集内的排序,这意味着我不能保证集将始终效应 - 排序> GetPrority()
如果这是真的,有没有一种安全的方式(如没有RemainingTurns组成的关键),除了复制,修改,擦除,然后插入我需要改变?
编辑:
@ildjarn - 对不起,我没想到的是重要的。它只是返回一个存储在StatusEffect中的int值。该int保证不会改变程序的运行时间。
int StatusEffect::GetPriority() const
{
return StatusPriority;
}
听起来像是['的std :: priority_queue <>'](HTTP的情况下://www.sgi的.com /技术/ STL/priority_queue.html)容器代替;对于更复杂的情况,请参见[升压多指标(http://www.boost.org/doc/libs/1_37_0/libs/multi_index/doc/index.html ) – sehe 2011-05-20 06:28:27
@sehe:可以事先ity处理更改密钥而不重新插入? – 2011-05-20 06:30:40
当我们看不到'StatusEffect :: GetPriority()'的实现时,我们怎么可能知道'RemainingTurns''可变性是否很重要? – ildjarn 2011-05-20 06:30:47