我很好奇以下情況是否安全。修改組內對象的可變成員是否安全?
我有下面的類定義:
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