12

C++ 標準ライブラリのmax_elementアルゴリズムでは、モデルに入力として渡される反復子が必要ForwardIteratorです。

私の理解では、 aを使用して同じ範囲を複数回反復できることを指定することでForwardIterator絞り込むことができます。したがって、マルチパス アルゴリズムにはs が必要です。InputIteratorForwardIteratorForwardIterator

ただし、max_elementこれはマルチパス アルゴリズムではありません。最大要素を決定するには、範囲を 1 回反復するだけで十分です。では、なぜmax_elementの追加機能が必要なのForwardIteratorでしょうか?

4

1 に答える 1

19

std::max_element最大要素への反復子を返します。単一のパス範囲を指定すると、アルゴリズムはその範囲で完全なパスを実行する必要があるため、その反復子は無効になります。

単一のパス範囲では、使用可能な反復子を前の値に保持することはできません。これは++r、標準の表 107 に示されている事後条件によるものです。

post: の以前の値のコピーは、r逆参照可能である必要も、 のドメインにある必要もありません==

基本的に、シングルパス範囲は、通過すると「消える」std::max_element範囲であり、イテレータを (おそらく) その中間に戻すために、残りの範囲が必要です。

イテレータの代わりに実際の最大値を返す最大値を計算するアルゴリズムを作成することもできますが、値で返すために値をコピー可能にする必要があります。移動すると const イテレータの使用が妨げられるため、移動可能では不十分です。また、参照によって返すこともオプションではありません。これは、範囲が実際に立ち往生していることを意味するためです。

于 2012-09-17T02:07:31.240 に答える