編集:のドキュメントはstd::remove
、この回答が書かれてから修正されています。同じことがにも当てはまりますlist::remove
。
cpluscplus.comがどのようにそれを誤解することができるかを示すために例を挙げましょう。
std::remove
からの機能を検討してください<algorithm>
。
実際にはstd::remove
、アイテムはコンテナーから削除されません。その理由std::remove
は、イテレータのペアでのみ機能し、実際にアイテムを含むコンテナについて何も知らないためです。実際std::remove
には、基礎となるコンテナーを知ることはできません。これは、イテレーターのペアから、イテレーターが属するコンテナーについて発見する方法がないためです。だからといってstd::remove
、実際にはアイテムを削除しません。コンテナーからアイテムを実際に削除する唯一の方法は、そのコンテナーのメンバー関数を呼び出すことです。
したがって、アイテムを削除する場合は、Erase-Remove Idiomを使用します。
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
しかしcplusplus.com
、に関する誤った情報を提供しstd::remove
ます。それは言う
この関数があることに注意してください変更されません新しいエンド過去の要素、その古い値を保持しているまだアクセスを。
これは正しくありません。範囲内のイテレータ[new_end, old_end)
は引き続き逆参照可能ですが、古い値が保持され、引き続きアクセスできることを意味するわけではありません。それらは指定されていません。
同様に、cplusplus.com
与え間違っに関する情報list::remove
だけでなく、を。それは言う、
グローバルアルゴリズム関数remove が同様の動作で存在しますが、2つの反復子間で動作していることに注意してください。
これは完全に間違っています。グローバル削除、すなわちstd::remove
類似していないlist::remove
、我々は前者がいるのを見て、本当に削除しないコンテナからアイテムを、それができないので、後者(メンバ関数)に対し、実際に削除しない項目を、それは可能性があるため。
この回答は、次のトピックの私の別の回答からほとんど変更されずにコピーされています。
注:上記のトピックで返信しているときに最近これに遭遇したので、覚えています。私が過去2年間に遭遇した多くのエラーがあり、それを覚えていません。再び出くわした場合、後でさらに追加する可能性があります。