2013-06-04 9 views
6

私は現在STLを学んでいますが、findとconstのイテレータについていくつかの不確実性があります。 のは、私は検索機能を持っているとしましょう:その後C++ STL、定数反復子、find()

some_stl_container::const_iterator found = myContainer.find(value); 

私は別のconst_iteratorのに対してfoundのために得たものを確認する必要があります、またはそれは単にイテレータに対するチェックを行うことが有効 です。

if(found!=myContainer.cend()) 

と、この:

if(found!=myContainer.end()) 

最初は(少なくとも私には)より正確に見えますが、2番目は右、あまりにも正常に動作する必要があります は、基本的にこれを行うことの間に違いがあるでしょうか?

+0

[const to non-constイテレータの比較は可能ですか?](http://stackoverflow.com/questions/16900498/const-to-non-const-iterator-comparisons-are-they- valid) – juanchopanza

+0

C++ 11までは 'cend'が存在しなかったことを考えると、いくらかのやり方が必要でした。 –

答えて

8

すべての標準ライブラリコンテナは、Container::iteratorContainer::const_iteratorに変換可能であるという要件を満たしています。したがって、両方の比較が有効で、同じ結果が得られます。 §23.2.1から

- 表96

X::iterator...前方反復子を 要件を満たす任意のイテレータカテゴリ。 X::const_iteratorに変換可能です。

+0

面白いことは、標準で 'x.cend()== X :: const_iterator(x.end())'という確認を見つけようとしたところです。そして1つを見つけられなかった(私はいくつかの明白な論理的結論を欠いているかもしれない)。定義によって 'x.cend()== const_cast (x).end()'しかし、これが最初のアサーションをどのように証明するかはわかりません。 –

+0

@SergeDundichあなたの質問が分かりません。私が引用したことは、コンテナに関しては、 'iterator'は' const_iterator'に変換可能であることを明確に述べています。 2つのイテレータを比較するために 'operator =='を使うことができるかどうかを尋ねるなら、私の[この回答](http://stackoverflow.com/a/16901637/241631)を参照してください。 – Praetorian

1

イテレータがmyContainer.end()と異なるかどうかを確認するのは問題ありません。 cendcbeginメソッドは、constイテレータを明示的に取得するためにここにしかないので、あなたのケースで違いはありません。あなたはイテレータ型を推測するために、C++ 11でauto found = myContainer.find(value)を行うには、一部の人々は標準ライブラリが正しい名前(ないSTL)であることを主張することができ

注意。

+1

あなたの2番目の発言について:http://en.wikipedia.org/wiki/Standard_Template_Library – lightxbulb

+0

私は、実際に元のSTLとは違うhttp://en.wikipedia.org/wiki/C%2B%2B_Standard_Libraryを意味します( http://stackoverflow.com/questions/5205491/whats-this-stl-vs-c-standard-library-fight-all-about)でも、これはひげのない純粋な議論です:p –

+0

@lightxbulb:あなたがリンクしている記事STLは、現代の標準ライブラリの一部にインスピレーションを与えた古代図書館です。あなたの質問は、特にSTLコンテナには 'cend'関数がなかったので、STLではなくC++ 11標準ライブラリに関するものです。 –