2016-11-06 8 views
3

これについて適切なソースを見つけることができませんでした。 <algorithm>ヘッダー内のすべてのアルゴリズムは、イテレータをインクリメント(場合によってはデクリメント)するためにstd::advanceを使用しますか?C++の標準ライブラリアルゴリズムはstd :: advanceを使用しますか?

また別の関連するフォローアップ - RandomAccessIteratorコンセプト(http://en.cppreference.com/w/cpp/concept/RandomAccessIterator)のcppreferenceページを見ましたが、イテレータカテゴリのメンバエイリアスを持つ必要はありません。イテレータクラスにというメンバ型のtypedefがなく、random_access_iterator_tagにエイリアスされていますが、RandomAccessIteratorのcppreferenceページ(http://en.cppreference.com/w/cpp/concept/RandomAccessIterator)に記載されている操作をサポートしている場合、C++標準ライブラリはイテレータがランダムアクセスイテレータであると見なしますか?

私はこの問題について、C++標準を参照して質問するつもりでした。すなわち、「これについて標準が何を言っているのか」

+0

イテレータを1以上進めなければならないアルゴリズムはありません。頭に浮かぶアルゴリズムは通常、イテレータをインクリメントまたはデクリメントするので、 '++'と '--'。おそらく、並べ替えとシャッフルを除いて。しかし、いずれの場合でも、ヘッダーファイル自体を検索することで簡単に答えを判断できます。あなた自身でこれを理解することができるはずです。 –

+2

@SamVarshavchik私は標準からの可能な見積もりを探してこの質問をしました。実装を見ることは、標準を維持しながら変更することができるため、十分ではありません。また、頻繁に使用される 'std :: upper_bound'と' std :: lower_bound'は、ほとんどの実装で 'n'ステップでイテレータを進めるために' std :: advance'を使用します – Curious

+0

私はセクション25、 "アルゴリズムとしょうかん"。最初の段階では 'advance()'の記述は1つしかありませんが、このセクションの仕様で 'a + n 'への参照は非ランダムアクセスイテレータに適用されたときに" as '' advance() 'が使われた場合私はこれが実際に 'advance()'を必要としていると主張する準備はできていません。 advance()が使用されているかのように「状態」が示されます。それは明らかに* 'advance()'を禁止しませんが、IMOを必要としません。私はこれに 'language-lawyer'タグを追加します。 –

答えて

2

標準では、C++ stdアルゴリズムの実装を明示的に指定していません。それは振る舞いを指定し、特定の操作が何回行われるかを指定します。これは実装者にほとんど実用的な選択肢を与えないが、明示的には指定されていない。

std::advance私の知る限りでは、他のアルゴリズムによって呼び出されるということは決して標準では呼び出されません。つまり、特定のアルゴリズムの特定の実装で使用されるか、使用されない可能性があります。

std::advanceの効果が指定されています。 std::advanceに電話するために、他のアルゴリズムが動作カウントを指定する限り、保証を破らないようにする必要があります。

要するに、これを使用することは許可されており、必須ではありません。

関連する問題