10

C ++標準の§25.2.4.2(std::for_each):

template<class InputIterator, class Function>   Function
for_each(InputIterator first, InputIterator last, Function f);

効果:[first、last)の範囲内のすべてのイテレータを、最初から最後の1まで逆参照した結果にfを適用し ます

  • これは、fがコンテナの要素に順番に適用されることを意味しますか?
  • もしそうなら、libstdc ++の並列モードはそれに違反しますか?
  • そうでない場合、§6.5.4の範囲ベースのforループがstd :: for_eachの呼び出しとして実装されていないのはなぜですか?(これにより、範囲ベースのforループも実装によって自動的に並列化されます)
4

2 に答える 2

8
  • fこれは、それがコンテナの要素に順番に適用されることを意味しますか?

もともとはノーと言っていましたが、そういう意味だと思います。他のアルゴリズムには、その特定の表現は含まれていません。

  • もしそうなら、libstdc ++の並列モードはそれに違反しますか?

たぶん、並列モードは拡張であり、いくぶん実験的なものであり、標準ライブラリの100%準拠の実装であるとは実際には主張していません。(ドキュメントのどこかでドキュメントを修正すると主張している場合は!;-)

  • そうでない場合、§6.5.4の範囲ベースのforループがstd :: for_eachの呼び出しとして実装されていないのはなぜですか?(これにより、範囲ベースのforループも自動的に並列化できます)

範囲ベースforは、動作する標準ライブラリに依存しません。std::beginとが表示されている場合std::endは使用できますが、必須ではありません。また、ループ本体をラムダとしてパッケージ化する必要があるため、渡す関数オブジェクトがありますstd::for_each。これにより、範囲ベースの仕様が複雑になりますfor。これは、同じセマンティクスを持ち、手とまったく同じ効率であると想定されています。書かれたforループ。しかし、本当の理由は、誰もそれをそのようにしようとは思わなかったということかもしれません!

于 2013-02-12T17:58:43.510 に答える
3

そうでない場合、§6.5.4の範囲ベースのforループがstd :: for_eachの呼び出しとして実装されていないのはなぜですか?(これにより、範囲ベースのforループも自動的に並列化できます)

ええと、標準で「自動的に並列化」することは許可されていません(標準で述べられているように、順次進行する必要がありますstd::for_eachしかし、もっと重要なことは、範囲ベースforでは、以外のことも可能std::for_eachです。言語機能として、たとえば、breakループの外に出ます。gotoまたは他の言語構造を使用できます。などなど。

std::for_each反復ごとに関数を呼び出すことに基づいています。そして、関数から実際に「抜け出す」ことはできません。

于 2013-02-12T18:39:31.620 に答える