1. ホーム
  2. c++

[解決済み] C++11のforループでwhileベクトルから項目を削除する?

2022-09-04 04:49:01

質問

IInventory* のベクトルがあり、C++11 の range for を使ってリスト内をループし、それぞれに対して何かを行っています。

1 つでいくつかのことを行った後、リストからそれを削除し、オブジェクトを削除したいと思うかもしれません。私は delete を呼び出すことができるのは知っていますが、ポインタをベクターから削除する適切な方法は何でしょうか。 for ループの中で、ベクターからそれを削除する適切な方法は何ですか?また、リストからそれを削除した場合、私のループは無効になるのでしょうか?

std::vector<IInventory*> inv;
inv.push_back(new Foo());
inv.push_back(new Bar());

for (IInventory* index : inv)
{
    // Do some stuff
    // OK, I decided I need to remove this object from 'inv'...
}

どのように解決するのですか?

いいえ、できません。範囲指定 for は、コンテナの各要素に一度だけアクセスする必要があるときのためにあります。

を使用する必要があります。 for ループを使用する必要があります。

例えば

auto i = std::begin(inv);

while (i != std::end(inv)) {
    // Do some stuff
    if (blah)
        i = inv.erase(i);
    else
        ++i;
}