c++ - 按位置删除 vector 中的元素?

标签 c++ sdl stdvector

在我的类(class)中,我尝试使用 for 循环从 std::vector 中删除一个元素。但是,当我尝试删除该元素时,我收到一个错误消息,我不太确定如何解决它。我得到的错误是:

Error 4 error C2679: binary '+' : no operator found which takes a right-hand operand of type 'Enemy *' (or there is no acceptable conversion)

void Enemy::UpdateEnemies(SDL_Renderer * render)
{
    for (int i = enemies.size() - 1; i >= 0; i--)
    {
        enemies[i]->Update();
        if (enemies[i]->Active == false)
        {
            // Receive the error here
            enemies.erase(enemies.begin() + enemies.at(i));             
        }
    }
    if ((SDL_GetTicks()-prevSpawnTime)/1000.0f > enemySpawnTime)
    {
        prevSpawnTime = SDL_GetTicks();
        //Add an anemy
        AddEnemy(render);
    }    
}

最佳答案

其他答案为您提供了天真的解决方案。但是,如果要移除的敌人不止一个,则需要更好的解决方案。

使用 std::remove_if来自 <algorithm>在这种情况下会更好。这将避免重复洗牌 vector 中的项目。它的工作原理是将您要删除的所有对象移动到容器的末尾,然后为您提供指向这些对象开头的迭代器。

auto removed_iter = std::remove_if( enemies.begin(), enemies.end(),
                                    []( const Enemy * e ) { return e->IsActive(); } );

enemies.erase( removed_iter, enemies.end() );

在这种情况下,您必须先更新所有敌人。如果不需要以相反的顺序完成,则:

for( auto e : enemies ) e->Update();

关于c++ - 按位置删除 vector 中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36272570/

相关文章:

python - 在 Raspberry PI 上安装 "ring.cx SIP client"

C++ 字符串比较

c++ - gcc 中 c++11 支持的官方状态

c++ - 寻找将 std::wstring 与 NSLog 一起使用的最便宜的方法

c++ - 在 XCode 上使用 SDL 框架时遇到问题

c++ - 错误 C2228 : left of '.push_back' must have class/struct/union

c++ - 作为参数传递时如何在不更改原始值的情况下附加到字符串?

c++ - 使用 C++ 使用 SDL2_gfx 问题

c++ - C++ 中 vector 的 vector 排序

c++ - 如何根据 .first 值从 std::pair 的 std::vector 中删除元素?