2017-05-17 10 views
5

std::max_element(std::begin(my_deque), std::end(my_deque))のようにコードすることはできますか?std :: max_element()をC++ 11のstd :: dequeで使用できますか?

dequeが連続してストアすることが保証されていないことがわかっているので、私は質問しています。だから、std::max_elementのようなイテレータを含む関数を使用すると、正しく動作するかどうかを知りたいですか?

ありがとうございました!

+0

いつも動作することが保証されないのではないかと心配していますか? – juanchopanza

+1

これらの仕様では 'ForwardIt'クラスのみが必要です。これは、前方反復を実装するすべてのコレクションで機能するはずです。連続したストレージとはまったく関係ありません。 –

+1

'std :: max_elements'はフォワードイテレータのみを必要とします。http://en.cppreference.com/w/cpp/algorithm/max_element –

答えて

7

std::max_elementは、我々はそれが前方反復子が必要であることを知っているテンプレートのタイプ名から

template<class ForwardIterator> 
ForwardIterator max_element(ForwardIterator first, ForwardIterator last); 

の形で署名されています。 96 [container.requirements.general] - テーブルごとに、私たちはstd::dequeが使用することを知っている

それは前方イテレータを使用するか、より良い、それは常になりますので、

だから、前方イテレータの要件を満たす任意のイテレータカテゴリはい。

6

はい正しく動作します。だから、

を調べるために、範囲を定義する前方反復子 - この場合に呼び出されるstd::max_elementの過負荷は、イテレータの唯一の要件は

firstlastある

template< class ForwardIt > 
ForwardIt max_element(ForwardIt first, ForwardIt last); 

ですランダムアクセス・イテレータは必要ありません。順方向イテレータのみです。

+0

あなたは '' max_element''について順方向イテレータしか必要としませんが、 '' std :: deque''イテレータのカテゴリについては混乱があるようです(ランダムアクセスです)。ランダムアクセス反復子を持つことは、連続したストレージを意味しません。 –

関連する問題