我有以下类定义:
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; }}
我很担心,因为这似乎有可能弄乱集合中的排序,这意味着我不能保证集合总是按效果排序 – > GetPrority()
如果这是真的,除了复制,修改,擦除然后插入我需要更改的内容之外,还有一种安全的方法(例如没有RemainingTurns构成密钥的一部分)吗?
编辑:
@ildjarn – 对不起,我觉得那不重要.它只返回一个存储在StatusEffect中的int.保证int不会改变程序的运行时.
int StatusEffect::GetPriority() const{ return StatusPriority;}解决方法 更改影响对象排序的数据确实会破坏关联容器的不变量,但是因为ActiveStatusEffect :: ReminaingTurns不参与ActiveStatusEffect对象的排序,所以保持它可变并修改其值是完全无害的.
I’m concerned because it seems possible for this to mess up the ordering within the set,meaning I can’t guarantee the set will always be sorted by effect->GetPrority()
它是一个std :: set< StatusEffects :: ActiveStatusEffect,ASECmp> ;;除了ASECmp定义的标准之外,它怎么能按任何标准排序?
总结以上是内存溢出为你收集整理的c – 在集合中修改对象的可变成员是否安全?全部内容,希望文章能够帮你解决c – 在集合中修改对象的可变成员是否安全?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)