加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在集合中修改对象的可变成员是否安全?

发布时间:2020-12-16 05:00:32 所属栏目:百科 来源:网络整理
导读:我很好奇以下情况是否安全. 我有以下类定义: class ActiveStatusEffect{public: StatusEffect* effect; mutable int ReminaingTurns; ActiveStatusEffect() : ReminaingTurns(0) { } //Other unimportant stuff down here} 然后我将一组这些存储在std :: se
我很好奇以下情况是否安全.

我有以下类定义:

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&gt ;;除了ASECmp定义的标准之外,它怎么能按任何标准排序?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读