9

std::listで見つけた後、から要素を削除する必要がありstd::findます。リストstd::list::eraseので呼び出す動作はどうなりますか?end()私の場合は次のようなものです。

std::list<T> mylist;
T value;
std::list::iterator it = std::find(mylist.begin(), mylist.end(), value);
std::list::iterator next = mylist.erase(it);

cplusplus.comによると:

位置(または範囲)が有効な場合、関数は例外をスローしません(スローなしの保証)。そうしないと、未定義の動作が発生します。

end()しかし、私が知らないのは、そこで有効と見なされるかどうかです。

4

3 に答える 3

19

そのサイトでは、あいまいな(そして間違いなく正しくない)用語「有効」が使用されていますが、ライブラリ仕様(C ++ 11 23.2.3)では、より具体的な用語「逆参照可能」が使用されています。つまり、イテレータはオブジェクトを参照する必要があります。過去のイテレータは参照解除できないため、イテレータを消去すると未定義の動作が発生します。

于 2013-02-27T16:09:14.117 に答える
6

そうではありません。消去しようとするとend()、未定義の動作が発生します。

于 2013-02-27T16:05:46.970 に答える
2

end()リストの最後のオブジェクトではなく、リストコンテナの過去のイテレータを参照するイテレータを返します。

endを削除/消去することにより、リストの範囲外を削除することになります。コードは次のようになります。

std::list<T> mylist;
T value;
std::list::iterator it = std::find(mylist.begin(), mylist.end(), value);
If(it!=mylist.end())
  std::list::iterator next = mylist.erase(it);

また、find()がリスト内の値を見つけられなかった場合、終了イテレータを返します。基本的に、検索している値がリスト外(リスト内ではない)であることを示しています。

于 2013-02-27T16:08:19.667 に答える