問題タブ [stdtuple]
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++ - std::tuple の要素を後でアロケータで構築する可能性はありますか?
私が理解している限り、自分のコンテナーに C++ のアロケーターを使用する理由の 1 つは、割り当てと構築を分離できることです。
さて、これが std::tuples で次の方法で可能かどうか疑問に思います: std::tuple を構築するたびに、スペースは予約されますが、オブジェクトは (まだ) 構築されません。代わりに、必要なときに i 番目の引数を作成するためにアロケータを使用できます。
擬似コード:
考えられる問題の 1 つは、通常、アロケーターが型にバインドされているため、型ごとに 1 つのアロケーターが必要になることです。もう 1 つの問題は、std::tuple のメモリをヒープに割り当てる必要があるかどうか、またはスタックが機能するかどうかです。どちらも私にとっては問題ありません。
それでも何とか出来るのでしょうか?そうでない場合は、自分で作成したアロケーターでこれを行うことができますか?
c++ - unordered_map でのタプルの使用
で構成されるタプルをint
、char
、で使用char
したいunordered_map
。私はこのようにやっています:
しかし、これにより次のエラーが発生します。
私はこれで何が間違っていますか?
c++ - インデックスによって実行時に std::tuple 要素にアクセスする最適な方法
at
実行時に指定されたインデックスで std::tuple 要素にアクセスするように設計された関数があります
線形の複雑さがあります。O(1) の複雑さを達成するにはどうすればよいですか?
c++11 - ネストされた std::forward_as_tuple とセグメンテーション違反
私の実際の問題はもっと複雑で、ここでそれを再現するための短い具体的な例を示すことは非常に難しいようです. したがって、関連する可能性のある別の小さな例をここに投稿しています。その議論は、実際の問題にも役立つ場合があります。
実際の問題には が含まれていないstd::tuple
ため、例を独立させるために、カスタムの最小限の大まかな同等物を次に示します。
これらの定義を考えると、まったく同じ動作になります。
一般に、動作はコンパイラと最適化レベルに依存するようです。デバッグしても何もわかりませんでした。すべての場合において、すべてがインライン化および最適化されているように見えるため、問題の原因となっている特定のコード行を特定できません。
それらへの参照がある限り一時変数が存続することになっている場合 (関数本体内からローカル変数への参照を返さない場合)、上記のコードが問題を引き起こす可能性がある根本的な理由と、ケース A とB は異なるはずです。
私の実際の問題では、Clang と GCC の両方で、最適化レベルに関係なく、ワンライナー バージョン (ケース A) でもセグメンテーション エラーが発生するため、問題は非常に深刻です。
代わりに値または右辺値参照 (たとえばstd::make_tuple
、またはnode <A...>
カスタム バージョン) を使用すると、問題はなくなります。タプルがネストされていない場合も消えます。
しかし、上記のどれも役に立ちません。私が実装しているのは、ビュー用の一種の式テンプレートと、タプル、シーケンス、および組み合わせを含む多数の構造に対する遅延評価です。したがって、一時変数への右辺値参照が絶対に必要です。入れ子になったタプル、たとえば(a, (b, c))
、入れ子になった操作を含む式、たとえば、すべてが正常に機能しますu + 2 * v
が、両方ではありません。
上記のコードが有効かどうか、セグメンテーション違反が予想されるかどうか、それを回避する方法、コンパイラと最適化レベルで何が起こっているのかを理解するのに役立つコメントをいただければ幸いです。
c++ - タプルからペアを割り当てることができないのに、ペアからタプルを割り当てることができるのはなぜですか?
譲渡が合法である理由がよくわかりませんtuple<X,Y>=pair<X,Y>
ただし譲渡は違法pair<X,Y>=tuple<X,Y>
これは左右対称ではないでしょうか。
g++ 4.8.1 を使用すると、次のエラーが発生します。