列出C ++如何编辑特定元素

时间:2012-12-31 13:09:27

标签: c++ list pointers

我对列表感到有些困惑。见下文:

int ParticleSystemManager::CreateParticleSystem()
{
    ParticleSystem* system = new ParticleSystem(Vector3(), Vector3(), 10, 1);
    system->SetLifeTime(200);

    list<ParticleSystem>::iterator it = particleSystems.begin();

    particleSystems.insert(it, *system);

    selectedParticleSystem = system;

    return 0;
}

我想要做的是获取我刚刚创建的particleSystem将它添加到粒子系统列表中,但是我也想要将添加的粒子系统存储在指针中。我注意到,当迭代列表时,内存位置与selectedParticleSystem指针存储的位置不同。我怎样才能使它们一样?更新如下:

void ParticleSystemManager::Update(float elapsedTime)
{
    for (std::list<ParticleSystem>::iterator iterator = particleSystems.begin(), end = particleSystems.end(); iterator != end; ++iterator) 
    {
        iterator->Update(elapsedTime);
    }
}

2 个答案:

答案 0 :(得分:1)

  

我注意到,当迭代列表时,内存位置与selectedParticleSystem指针存储的位置不同。

这是因为std::list::insert创建了对象的副本

您的选择是:

  1. 改为创建list指针(尽管有几个原因,您可能希望使用智能指针)。

  2. 获取指向列表中对象的指针,然后存储该指针。类似的东西:

    selectedParticleSystem = &(*particleSystems.insert(it, *system));
    

    如果你这样做,你当然需要delete原始对象,否则你会有内存泄漏。

答案 1 :(得分:1)

添加Oli的答案:如果您使用C ++ 11,则可以使用emplace 代替在列表中创建新的ParticleSystem:

particleSystems.emplace(particleSystems.begin(),Vector3(), Vector3(), 10, 1);
particleSystems.begin()->SetLifeTime(200);

selectedParticleSystem=particleSystems.begin();