これを行う「正しい」方法は、アルゴリズムを使用することです。
#include <algorithm>
#include <functional>
// this is a function object to delete a pointer matching our criteria.
struct entity_deleter
{
void operator()(Entity*& e) // important to take pointer by reference!
{
if (e->GetXPos() > 1.5f)
{
delete e;
e = NULL;
}
}
// now, apply entity_deleter to each element, remove the elements that were deleted,
// and erase them from the vector
for_each(Entities.begin(), Entities.end(), entity_deleter());
vector<Entity*>::iterator new_end = remove(Entities.begin(), Entities.end(), static_cast<Entity*>(NULL));
Entities.erase(new_end, Entities.end());
今、私はあなたが何を考えているか知っています。あなたは、他の答えのいくつかがより短いと考えています。ただし、(1) 通常、この方法はより高速なコードにコンパイルされます。比較してみてください。(2) これが「適切な」STL の方法です。(3) ばかげたエラーが発生する可能性が少なく、(4) 読みやすいです。 STLコードが読めるようになったら STL プログラミングを学ぶ価値はあります。Scott Meyer の素晴らしい本「Effective STL」をチェックすることをお勧めします。この本には、この種の STL に関するヒントがたくさんあります。
もう 1 つの重要な点は、操作が終了するまで要素を消去しないことで、要素をシャッフルする必要がないことです。GMan はこれを避けるためにリストを使用することを提案していましたが、この方法を使用すると、操作全体が O(n) になります。対照的に、上記のニールのコードは O(n^2) です。これは、検索が O(n) であり、削除が O(n) であるためです。