我很好奇以下情况是否安全。
我有以下类定义:
class ActiveStatusEffect
{
public:
StatusEffect* effect;
mutable int ReminaingTurns;
ActiveStatusEffect() : ReminaingTurns(0)
{
}
//Other unimportant stuff down here
}
然后我将一组这些对象存储在std::set中,如下所示:
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;
}
}
我有所顾虑,因为这可能会破坏集合内的排序,这意味着我无法保证集合始终按effect->GetPrority()排序。如果是这样,是否有一种安全的方法(例如不将RemainingTurns作为键的一部分)可以做到这一点,而不是复制、修改、删除然后插入需要更改的内容?
编辑:
@ildjarn - 对不起,我认为那并不重要。它只返回存储在StatusEffect中的int。该int保证在程序运行时不会改变。
int StatusEffect::GetPriority() const
{
return StatusPriority;
}
std::priority_queue<>
容器;对于更复杂的情况,请参考 Boost MultiIndex。 - seheRemainingTurns
的可变性是否重要,当我们看不到StatusEffect :: GetPriority()
的实现时? - ildjarn