Tenía curiosidad sobre si el siguiente escenario es seguro.¿Es seguro modificar miembros mutables de objetos dentro de conjuntos?
que tienen las siguientes definiciones de clases:
class ActiveStatusEffect
{
public:
StatusEffect* effect;
mutable int ReminaingTurns;
ActiveStatusEffect() : ReminaingTurns(0)
{
}
//Other unimportant stuff down here
}
entonces almacenar un grupo de éstos dentro de un std :: set de la siguiente manera:
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;
taco RemainingTurns como mutable porque quiero ser capaz de cambiarlo sin tener que borrar/insertar constantemente en el conjunto. Es decir.
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;
}
}
que a mí respecta, ya que parece posible que esto desordenar el orden dentro del conjunto, lo que significa que no puedo garantizar el conjunto será siempre ordenadas según la efecto-> GetPrority()
Si eso es cierto, ¿hay una manera segura (como no tener Remanente de Formas formando parte de la clave) para hacer esto además de copiar, modificar, borrar y luego insertar lo que necesito cambiar?
EDIT:
@ildjarn - lo siento, no pensé que importaba. Simplemente devuelve un int almacenado dentro de StatusEffect. Que int se garantiza que no cambiará durante el tiempo de ejecución del programa.
int StatusEffect::GetPriority() const
{
return StatusPriority;
}
Suena como un caso para ['std :: priority_queue <>'] (http: //www.sgi .com/tech/stl/priority_queue.html) contenedor en su lugar; para escenarios más complejos, vea [Boost MultiIndex] (http://www.boost.org/doc/libs/1_37_0/libs/multi_index/doc/index.html) – sehe
@sehe: ¿Puede un previo ¿Manejan las llaves cambiantes sin reinserción? –
¿Cómo podemos saber si la mutabilidad de 'Remaneciendo'' importa cuando no podemos ver la implementación de' StatusEffect :: GetPriority() '? – ildjarn