0

STL を試してみたところ、問題が発生しました。そのように機能する方法を説明できませんでした。私は以下のいくつかのコードを持っています:

int main(int argc, char **argv) {
    vector<int> myvector(3,20);
    vector<int>::iterator it;

    myvector.push_back(12);
    myvector.push_back(15);

    int i = 0;
    for(it = myvector.begin(); it!=myvector.end(); it++)
    {
        if(*it==20)
        {
            cout<<"delete "<<i<<endl;

            myvector.erase(it);
        }
        i++;
    }

    for(it = myvector.begin(); it!=myvector.end(); it++)
        cout<<*it<<"  ";

vector.erase() は 3 番目の項目 (私のベクターでは '20') を消去しませんでした。出力は : 20 12 15 ですが、次のようにすべきだと思います: 12 15.

だから、誰でもそれが私にとってどのように機能するかを説明できますか、それともどこかで間違いを犯しましたか? 本当にありがとう。

4

1 に答える 1

1

イテレーターを使用して STL コンテナー内のアイテムを削除すると、以前のイテレーターはすべて無効になります。したがって、myvector.erase(it) の後は無効になります。これに対処するために、erase は次の要素を指す新しい反復子を返します。したがって、コードは次のようになります。

for(it = myvector.begin(); it!=myvector.end(); )
{
    if(*it==20)
    {
        cout<<"delete "<<i<<endl;

        it = myvector.erase(it);
    } else {
        it++;
    }
    i++;
}

また、ループ内でインクリメントするだけです。そうすれば、消去するときに、余分な要素を前方にジャンプすることはありません。

于 2013-10-02T04:00:26.980 に答える