移除和删除与向量中的条件匹配的指针

Mor*_*oth 1 c++ stl c++17

我有一个std::vector我想从满足条件的向量中删除指针isDestroyed(),但还要对指针调用 delete 。

我做了以下操作,但它需要对向量循环两次。有没有更有效的方法来做到这一点?

std::vector<GameObject*> gameObjects;
std::vector<GameObject*> destroyedObjects;
// Get objects to be deleted
std::copy_if (gameObjects.begin(), gameObjects.end(), std::back_inserter(destroyedObjects), [](GameObject* b){return b->isDestroyed();} );
// Remove objects from vector
gameObjects.erase(
    std::remove_if(
            gameObjects.begin(),
            gameObjects.end(),
            [](GameObject* p) { return p->isDestroyed(); }
    ),
    gameObjects.end()
);
// Delete the objects
for (GameObject* o : destroyedObjects)
    delete o;
Run Code Online (Sandbox Code Playgroud)

Ala*_*les 6

这应该有效:

std::vector<GameObject*> gameObjects;
auto end = std::stable_partition(
            gameObjects.begin(),
            gameObjects.end(),
            [](GameObject* p) { !return p->isDestroyed(); }
    );
for (auto i = end; i < gameObjects.end(); i++) {
    delete *i;
}
gameObjects.erase(end, gameObjects.end());
Run Code Online (Sandbox Code Playgroud)


wal*_*nut 6

std::unique_ptr 免费删除:

std::vector<std::unique_ptr<GameObject>> gameObjects;

// Remove objects from vector
gameObjects.erase(
    std::remove_if(
            gameObjects.begin(),
            gameObjects.end(),
            [](const auto& p) { return p->isDestroyed(); }
    ),
    gameObjects.end()
);
Run Code Online (Sandbox Code Playgroud)

我建议改用它。它还避免了忘记删除或重复删除等错误。