1. ホーム
  2. c++

[解決済み】このベクトルイテレータはなぜインクリメント可能ではないのですか?

2022-01-28 15:42:12

質問

ベクターの内容を削除しようとすると、vector iterator is not incrementable というエラーが出ますが、なぜでしょうか?

これは私のデストラクタです。

City::~City()
{
    vector <Base*>::iterator deleteIterator;
    for (deleteIterator = m_basesVector.begin() ; deleteIterator != m_basesVector.end() ; deleteIterator++)
        m_basesVector.erase(deleteIterator);
}  

ありがとうございます。

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

erase はイテレータを無効にします。これ以上使えません。幸運なことに、これは使えるイテレータを返します。

vector <Base*>::iterator deleteIterator = m_basesVector.begin();
while (deleteIterator != m_basesVector.end()) {
    deleteIterator = m_basesVector.erase(deleteIterator);
}

または

m_basesVector.clear();

ベクター内のポインターから参照されるメモリの解放はあなたの責任ですか?もしそれが反復処理をしている理由なら(そしてあなたの実際のプログラムには、あなたが見せていない、ループ内でそれらのオブジェクトを解放するコードがもっとあります)、ベクトルの先頭から消去するのは遅い処理であることに留意してください。なぜなら各ステップで、ベクトルのすべての要素を1つ下にシフトしなければならないからです。それよりも、ベクターの上でループしてすべてを解放する方がよいでしょう (その場合 clear() Mikeが言うように、ベクターが破壊されるオブジェクトのメンバーであればその必要はないのですが)。