2013-02-27 9 views
7

std::findで見つけたstd::listから要素を削除する必要があります。リストのend()std::list::eraseを呼び出す動作は何ですか?私の場合はこのようなものです:`std :: list`の` 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()がそこで有効であるかどうかです。

+0

'end()'は最後の要素を1つ超えています。 –

+0

cplusplus.comも同様に評判の良い情報源の範囲外です。代わりにcppreference.comを参照してください。 – Potatoswatter

+0

@Potatoswatter:インターネットは評判の良い情報源の範囲外です。代わりに言語仕様を参照してください。 –

答えて

17

このサイトでは、あいまいな(間違いがあると思われる)用語 "valid"が使用されていますが、ライブラリ仕様(C++ 11 23.2.3)では、より具体的な用語 "dereferenceable"オブジェクトを参照する必要があります。過去のイテレータは参照不可能ではないため、消去すると未定義の動作が発生します。

+3

+1また、私は、Webには曖昧なものよりも悪い問題があると考えています。 'valid'は標準で使われている用語で、' end() 'は*有効な*イテレータ(つまり、Webページが*曖昧ではない、**間違っている**) –

+0

実際には、ライブラリ仕様では "有効"も使用されます(挿入の場合、 'end()' --Iteratorはok)が、単一イテレータ消去の要件として明示的に "valid * and * dereferencable"と表示されます。 –

+0

ありがとう!これは私が探していたものです。私は仕様にアクセスできない。それがC++ 03で同じであるかどうか知っていますか? – Janoma

6

これはありません。 end()を消去しようとすると、定義されていない動作が発生します。

2

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); 

また検索()は、それが最後のイテレータを返しますあなたのリスト内の値を見つけるために失敗した場合、基本的に(あなたが探している値がリストの外にあることを語っています

+0

コンテナには過去の要素はありません。 'end()'は、過去の**イテレータ**を返します。一般的に、過去のイテレータは要素を参照する必要はありませんが、多くの状況で実際にはそうしています。 –

+0

修正済み、怒る必要はありません –

+0

Mad?私はそのように遭遇しなかったことを願っています。 –

関連する問題