0

イテレータが同じ要素を指している状況を意味します。

http://www.cplusplus.com/reference/stl/list/erase/で、「リスト コンテナーから単一の要素 (位置) または要素の範囲 ([first,last)] を削除します。」と言いますおよび "first, last 削除するリスト コンテナー内の範囲を指定する最初、最後のイテレータ: [first,last)。つまり、範囲には、first と last の間のすべての要素が含まれます。これには、first が指す要素は含まれますが、last が指す要素は含まれません。 "

すべてが間違っているかどうかはまったくわかりませんが、コードのすべての部分で必要な情報がどこにも見つからず、自分でテストしたいときに、何が起こったのかわからない状況に陥りますここで質問して長時間議論した後、「未定義の動作」のようなものを見つけました。誰かが私をもっと早く助けてくれますか?

そして、私はより良いプログラマーになりたいと思っており、cplusplus.com と cppreference.com よりも優れたソースを見つけたいと思っています。私は毎日この C++ に夢中になっています (しかし、高速で巨大なプログラムには Java や C よりもはるかに優れていると思います)。助けてください。

4

2 に答える 2

9

標準独自の範囲の定義 (24.2.1p7、強調鉱山):

データ構造を操作するライブラリのアルゴリズム テンプレートのほとんどには、範囲を使用するインターフェイスがあります。範囲は、計算の開始と終了を指定する反復子のペアです。範囲[i,i)は空の範囲です。一般に、範囲[i,j)とは、 が指す要素から始まり、 が指す要素までのデータ構造内の要素を指します。iただし、 が指す要素は含まれませんj

したがって、itが 内または の末尾を過ぎた有効な反復子であると仮定するとlst、呼び出しlst.erase(it,it)は から空の要素のセットを消去しlstます。つまり、何もしません。

于 2012-09-20T20:46:53.417 に答える
2

あなたの質問に最もよく答えるには、イテレータがどのように機能するか、およびすべてが [first, last) として渡され、他のものではなく渡される理由について考える必要があると思います。

イテレータについては、覚えておく必要がある 2 つのコア ルールがあります。常に 1 つ (つまり、first++) をインクリメントすることができ、同じ要素を指す 2 つの反復子は常に等しくなります。これを知っていれば、ロジックを使用して任意の範囲の反復子をループできます。

for(; first != last; first++)
{
}

したがって、first と last が等しい場合、何も起こりません。したがって、list.erase(it, it) を呼び出すと、何も消去されません。

より一般的な形で表現すると. first == last である STL の範囲は実質的に空です。

于 2012-09-20T20:42:40.440 に答える