Delete dynamically allocated object from std :: vector

Is it correct?:

std::vector<Enemy*> enemies;
enemies.push_back(new Enemy());

Enemy* enemy = enemies[0];
enemies.erase(enemies.begin() + 0);
delete enemy;
+5
source share
4 answers

It works, yes, but it is not an ideal approach.

Firstly, adding 0 is just noise, you can remove it. But even better, just use it pop_front(). In addition, there is no need for an intermediate step, you can delete it before deleting.

But std::vectornot as good as jumping out from the front, especially if it is large (because the rest of the elements need to be moved to fill the void). If you do not need continuous memory, use instead std::deque. Or, if the order doesn't matter, you can use something like this:

template <typename T, typename A>
void unordered_pop_front(std::vector<T, A>& vec)
{
    using std::swap;
    swap(vec.front(), vec.back()); // constant time

    vec.pop_back(); // constant time
}

, . , .

. , , - . .

Boost ptr_vector std::vector . (: std::auto_ptr , .) std::unique_ptr ( ++ 0x), std::/boost::shared_ptr.

+8
std::vector<Enemy*> enemies;
enemies.push_back(new Enemy());

. push_back , Enemy .

, , :

std::vector<Enemy*> enemies;
enemies.reserve(1);    // or more generally, enemies.reserve(enemies.size()+1);
enemies.push_back(new Enemy());

, push_back , reserve , Enemy.

+4

, . + 0 enemies.erase, , , .

+2

, . :

delete enemies[0];
enemies.clear();

:

enemies.pop_back();

( ):

enemies.erase(enemies.begin());
+1
source

All Articles