問題タブ [range-v3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
165 参照

c++ - range-v3 を使用してコレクションの所有権を取得するにはどうすればよいですか?

次のような STL コレクションのビューを表す関数から範囲を返したいとします。

ただし、view::transformは の所有権を取得しないため、これを実行すると、終了時に が解放されるisため、未定義の動作が発生します。iscreateRange

入力として試してみるstd::move(is)と、右辺値参照を a への入力として使用できないことを示す静的アサートが表示されますview。ビューがコレクションの所有権を確実に取得する方法はありますか?

編集:いくつかの追加情報

明確な情報を追加したいと思います。私は、データを次のようなdata構造体に変換するビューを持っているデータのストリームを持っています。Foo

私がやりたいのはstd::pair<std::string, int>、値全体に名前を配布して範囲を作成することです。私の素朴な試みは次のようになります。

valuesただし、が解放されるため、未定義の動作が発生します。これを回避できた唯一の方法は、valuesaを作成std::shared_ptrし、渡されたラムダでそれをキャプチャして、そのview::transform寿命を維持することです。それは洗練されていない解決策のようです。

私が探しているのは、ソース コレクションの所有権を取得するビューだと思いますが、range-v3 にはそれがないようです。

別の方法として、古き良き for ループを使用して分散バージョンを作成することもできますが、次のようには機能しないようview::joinです。

これが で機能したview::joinとしても、範囲とループの混合メタファーも洗練されていないと思います。

0 投票する
0 に答える
60 参照

c++ - ループオーバータプルについて説明する

range-v3 では、以下は c++17 の正当なコードです。

私はその構文をauto [value, suit]どこにも見たことがありません.誰かがこれが可能な場合に説明できますか?
これがいつ使用されるかについての一般的な説明はありますか、それとも範囲ライブラリの魔法ですか?

0 投票する
3 に答える
4842 参照

c++ - 並列アルゴリズムでの range::view::iota の使用

はアルゴリズムのインデックスベースの並列がないため、それをエミュレートするために と組み合わせて使用​​できるかどうか疑問に思っています。あれは:ranges::view::iotastd::for_each

iota_view適切なタイプ( [range.iota.iterator] )のランダムアクセスを提供しているようです:

iota_view<I, Bound>::iterator::iterator_categoryは次のように定義されます。

(1.1) —IモデルAdvanceableの場合、iterator_categoryは ですrandom_access_iterator_tag

(1.2) — そうではなく、ImodelsDecrementableの場合iterator_categoryは ですbidirectional_iterator_tag

(1.3) — それ以外の場合、ImodelsIncrementableの場合iterator_categoryは ですforward_iterator_tag

(1.4) — それ以外の場合iterator_categoryは ですinput_iterator_tag

上記のコードは正しいですか?iota_viewこの方法を使用すると、パフォーマンスが低下することはありますか?


編集: range-v3cmcstl2、および Intel のPSTLでいくつかのテストを行いました。

range-v3 を使用すると、上記の例は GCC 8 でのコンパイルに失敗しbeginますend

cmcstl2 を使用すると、コードはきれいにコンパイルされますが、並列には実行されません。おそらくフォワードイテレータの要件が何らかの形で満たされていないため、順次バージョンにフォールバックしているように思えます( https://godbolt.org/z/yvr-M2 )。

多少関連する PSTL の問題があります ( https://github.com/intel/parallelstl/issues/22 )。

0 投票する
1 に答える
242 参照

c++ - 変換された範囲が空かどうかを判断しようとしています

ベクトルを受け取り、ビュー フィルターを適用してから変換を行い、最後に最後の要素が存在する場合はそれを返すコードを作成しようとしています。

これをコンパイルすると、次のエラーが発生します。

したがって、変換されたベクトルで動作しているという事実に関係なく、transform_view にはカーディナリティの概念が欠けているように見えます。このコードを機能させる範囲に適用できる演算子はありますか? 要素の正確な数を提供するのではなく、要素があるempty()どうかを検証するだけでよいため、カーディナリティを必要とするのは奇妙に思えます。