9

ループごとに新しいC++11を使用して、リストのすべての要素を反復処理し、特定の要素を消去したいと思います。例えば

std::list<int> myList;
myList.push_back(1); 
myList.push_back(13);
myList.push_back(9);
myList.push_back(4);

for(int element : myList) {
    if(element > 5) {
        //Do something with the element

        //erase the element
    }else{
        //Do something else with the element
    }
}

for eachループを使用してこれを行うことは可能ですか、それともこれを達成するためにイテレーターに戻る必要がありますか?

4

3 に答える 3

6

あなたはこれをすることができるはずです

myList.erase(std::remove_if(myList.begin(), myList.end(),
    [](int& element) 
    { 
        return element > 5;
    } 
    ),myList.end());

または単に(提供:Benjamin Lindley)

myList.remove_if(
    [](int& element) 
    { 
        return element > 5;
    } 
    );
于 2013-01-13T15:39:33.627 に答える
5

範囲ベースのforループ内の標準コンテナーの要素を、そのコンテナー上で消去することはできません。ループ自体には、現在アクセスしている要素へのイテレーターがあり、それを消去すると、ループがインクリメントする前にそのイテレーターが無効になります。

範囲ベースのforは、標準の6.5.4で、(わずかに簡略化された)と同等であると定義されています。

for (auto __begin=begin-expr, __end=end-expr; __begin != __end; ++__begin) {
    for-range-declaration = *__begin;
    statement
}

begin-exprend-expr独自の長い定義がありますが、あなたの例ではmyList.begin()myList.end()それぞれとです。

于 2013-01-13T16:04:02.420 に答える
0

いいえ、そうは思いません。このSOの答えを参照してください:

いいえ、できません。範囲ベースのは、コンテナの各要素に1回アクセスする必要がある場合に使用します。

進行中にコンテナを変更したり、要素に複数回アクセスしたり、その他の方法でコンテナを非線形に反復したりする必要がある場合は、通常のforループまたはその従兄弟の1つを使用する必要があります。

于 2013-01-13T15:40:21.170 に答える