3

この質問は、「明示的なループをまったく使用しないでください!」と考えさせられます。adjacent_differenceSTL/Boost アルゴリズムを使用する」ですが、詳しく見ると、 がありaccumulate、Boost がzipどこかにあることに注意してください。

while (i<l-1){
    ans = ans + max(abs(X[i]-X[i+1]), abs(Y[i]-Y[i+1]));
    i++;
}

それらは単にスタックすることはありませんが、それぞれが単独でパス全体を作成することしかできません。そのため、単純な方法でそれらを使用すると、部分的な結果を含む多数の中間コピーが必要になります。つまり、adgient_difference に、zip などの引数である新しいベクトルを書き込んでもらいます。

「最新の」C++ では、「コードを書く」べきではなく、明示的なループをめったに必要としないというのがマントラです。

しかし、私の実世界での経験は、このケースに似ています。実行することは単純なステップではなく、結果はそのようなバッチに収集されません。

では、実行する操作を参照しながら、範囲をループせず、各要素を明示的にプルせずに、合理化された方法でこれを記述するにはどうすればよいでしょうか。

ブースト イテレータ フィルタ、一般に、駆動ループ内で終了するより複雑なロジックを構築できます (したがって、中間結果の全体コピーはありません) が、この例には、ブースト範囲フィルタで何が制限されているかを示すいくつかの機能があります。forそして、それを設定することは、単にループを書くよりも複雑です!

では、C++ の「誰が誰だ」が、新しい言語とライブラリ機能を使用してそのように記述できるはずだと言っている場合、ここでどのようにそれを行うのでしょうか。

4

2 に答える 2

-1

現在、実際の製品コードで役立つ場合もあれば、そうでない場合もありますが、最終的に標準ライブラリの一部となるプロトタイプであるv3 Range ライブラリで、これは正面から対処されているようです。

イテレータに対する範囲の大きな利点は、構成可能性です。それらは、一連のコンビネータを介してデータを渡すことによってデータを操作する、関数型のプログラミング スタイルを可能にします。さらに、コンビネーターは、応答が要求されたときにのみ作業を行い、元のデータを変更せずに純粋に機能する、怠惰な場合があります。

この紹介ページの最初の例は、操作を一緒にパイプすることであり、最初に文書化されたもの (アルファベット順の偶然) はview::adjacent_filter.

私はまだインストールして試しておらず、この特定の例をコーディングする方法を学んでいませんが、これは欠けている部分だと思います. 今日のコードで十分に使えることを願っています。

于 2017-07-10T03:02:42.423 に答える