4

しばらくの間、ベクトルの要素を処理したいと思います。これを最適化するために、処理時にアイテムを削除したくないので、最後にすべての処理済みアイテムを削除します。

vector<Item*>::iterator it;
for(it = items.begin(); it != items.end(); ++it)
{
    DoSomething(*it);

    if(TimeIsUp())
    {
        break;
    }
}

items.erase(items.begin(), it);

消去を使用しても安全it == items.end()ですか?文書化ではerase()、[最初、最後]を消去すると言われており、これは安全なはずですが、確実にしたいと思います。

編集:

std :: vector.erase(begin()、begin())を使用しても安全ですか?

4

3 に答える 3

5

はい、これは正しいです-それが表記法の[first, last)意味でありend()、終わりを過ぎたところを指しています。

于 2012-12-17T17:11:34.040 に答える
3

あなたの編集に答えるために:はい、それも問題ありません。vec.erase(q1,q2)「範囲内の要素」を消去することとして定義されます[q1, q2)。ここでは、両方の引数は同じです。[q1, q2)有効な範囲の定数イテレータとして定義されます。q1到達するために実行できる増分のシーケンスがある場合、範囲は有効であると見なされq2ます。この場合、シーケンスには増分がありません。実際、この規格では特に空の範囲が定義されています。

範囲[i,i)は空の範囲です

于 2012-12-17T17:23:32.170 に答える
1

つまり、と[first,last)の間のすべてです。これには、が含まれますが、含まれません。ハーフオープンセットを示します。それらが使用されていた場合は、含まれます。それらが使用されていれば、除外されます。firstlastfirstlast[first,last]last(first,last)firstlast

コードに問題があります。がに等しくない場合は、の要素をit削除する必要があります。の代わりに、を使用する必要がありますitend()items.erase (items.begin(),it)

if (it != items.end()) {
   items.erase (items.begin(), it+1);
}
else {
   items.clear(); // same as items.erase (items.begin(), items.end())
}
于 2012-12-17T17:44:34.923 に答える