問題タブ [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.
c++ - range-v3 を使用してコレクションの所有権を取得するにはどうすればよいですか?
次のような STL コレクションのビューを表す関数から範囲を返したいとします。
ただし、view::transform
は の所有権を取得しないため、これを実行すると、終了時に が解放されるis
ため、未定義の動作が発生します。is
createRange
入力として試してみるstd::move(is)
と、右辺値参照を a への入力として使用できないことを示す静的アサートが表示されますview
。ビューがコレクションの所有権を確実に取得する方法はありますか?
編集:いくつかの追加情報
明確な情報を追加したいと思います。私は、データを次のようなdata
構造体に変換するビューを持っているデータのストリームを持っています。Foo
私がやりたいのはstd::pair<std::string, int>
、値全体に名前を配布して範囲を作成することです。私の素朴な試みは次のようになります。
values
ただし、が解放されるため、未定義の動作が発生します。これを回避できた唯一の方法は、values
aを作成std::shared_ptr
し、渡されたラムダでそれをキャプチャして、そのview::transform
寿命を維持することです。それは洗練されていない解決策のようです。
私が探しているのは、ソース コレクションの所有権を取得するビューだと思いますが、range-v3 にはそれがないようです。
別の方法として、古き良き for ループを使用して分散バージョンを作成することもできますが、次のようには機能しないようview::join
です。
これが で機能したview::join
としても、範囲とループの混合メタファーも洗練されていないと思います。
c++ - ループオーバータプルについて説明する
range-v3 では、以下は c++17 の正当なコードです。
私はその構文をauto [value, suit]
どこにも見たことがありません.誰かがこれが可能な場合に説明できますか?
これがいつ使用されるかについての一般的な説明はありますか、それとも範囲ライブラリの魔法ですか?
c++ - 並列アルゴリズムでの range::view::iota の使用
c++17にはアルゴリズムのインデックスベースの並列がないため、それをエミュレートするために と組み合わせて使用できるかどうか疑問に思っています。あれは:ranges::view::iota
std::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) — そうではなく、
I
modelsDecrementable
の場合iterator_category
は ですbidirectional_iterator_tag
。(1.3) — それ以外の場合、
I
modelsIncrementable
の場合iterator_category
は ですforward_iterator_tag
。(1.4) — それ以外の場合
iterator_category
は ですinput_iterator_tag
。
上記のコードは正しいですか?iota_view
この方法を使用すると、パフォーマンスが低下することはありますか?
編集: range-v3、cmcstl2、および Intel のPSTLでいくつかのテストを行いました。
range-v3 を使用すると、上記の例は GCC 8 でのコンパイルに失敗しbegin
ますend
。
cmcstl2 を使用すると、コードはきれいにコンパイルされますが、並列には実行されません。おそらくフォワードイテレータの要件が何らかの形で満たされていないため、順次バージョンにフォールバックしているように思えます( https://godbolt.org/z/yvr-M2 )。
多少関連する PSTL の問題があります ( https://github.com/intel/parallelstl/issues/22 )。
c++ - 変換された範囲が空かどうかを判断しようとしています
ベクトルを受け取り、ビュー フィルターを適用してから変換を行い、最後に最後の要素が存在する場合はそれを返すコードを作成しようとしています。
これをコンパイルすると、次のエラーが発生します。
したがって、変換されたベクトルで動作しているという事実に関係なく、transform_view にはカーディナリティの概念が欠けているように見えます。このコードを機能させる範囲に適用できる演算子はありますか? 要素の正確な数を提供するのではなく、要素があるかempty()
どうかを検証するだけでよいため、カーディナリティを必要とするのは奇妙に思えます。