問題タブ [valarray]

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 に答える
323 参照

c++ - valarray をゼロに明示的に初期化する際のあいまいさ?

std::valarray< double > myArray(3)valarray長さ 3 の を生成し、ゼロに初期化します。

std::valarray< double > myArray(1,3)valarray長さ 3 の を生成し、 1 に初期化します。

std::valarray< double > myArray(0,3)生成しerror: call to constructor of 'std::valarray<double>' is ambiguousます。

もちろんmyArray(3)、これがゼロに初期化されていることを確認するコメントを使用して追加することはできますが、私自身の理解のために、これがあいまいである理由を誰かが説明できることを望んでいました.

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

c++ - libstdc++ での mask_array の動作

ケース 1:

ケース 2:

ケース 3:

ケース 1 とケース 2 は両方とも期待どおりに機能します (データは適切に変更されます)。ただし、ケース3は恐ろしく信頼できないほど失敗します(私にとってはセグメンテーション違反です)。gdb でさらに調べると、内部に格納されたマスクが一時的なdata <= 2valarray のバッファーを指しているように見えますが、これは行 2 の後で破棄されます。次に、行 3 で書き込みを行うと、マスクは完全にガベージであり、それにインデックスを付けようとします。データのマスクされた値を設定することは、未定義の動作です。

この動作が許可されている理由を標準のどこにも見つけることができません (標準は valarray について奇妙にあいまいです)。これはlibstdc ++の偽物ですか、それともこの結果とその理由を期待する必要がありますか?

テストされたコンパイラ設定:

  • g++4.8.2 -O0 -g -std=c++0x
  • clang++ -O0 -g -std=c++11

libstdc++ の私のバージョンは 3.4.19 だと思います (これをたどって見つけました)

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

c++ - ベクトルから valarray を初期化するにはどうすればよいですか?

ベクトルの内容で valarray を埋めるために次のように書くことは、大丈夫/安全/良い習慣ですか?

正常に動作しているように見えますが、どのような場合でも動作することを確認したいと思います。

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

c++ - std::valarray にイテレータのペアを取るコンストラクタがないのはなぜですか?

質問は、この質問に対する私の頭から離れた答えから来ています(原因を削除しましたがstd::valarray、イテレータのペアを取るコンストラクタはありません...)。

問題は、なぜですか?

0 投票する
2 に答える
2346 参照

c++ - std::vector から std::valarray にデータを渡す最も効率的な方法

std::vectorデータを aからa に設定する最も効率的な方法は何std::valarrayですか? と がstd::valarray<double> my_valarray;ありstd::vector<double> my_vector;、データを から にコピーしたいとしmy_vectorますmy_valarray

オプション 1 (valarrayコンストラクターとコピー代入を使用):

オプション 2 (サイズ変更とコピー):

どちらの場合も、複雑さがO(2n)であるように見えるため、問題が発生します。最初のケースでは、データは構築中に一時的にコピーされvalarray(1 回の割り当て + データをコピーするための 1 回のパス)、最終オブジェクトへの割り当て時に (1 回の割り当て + データをコピーするための 1 回のパス) コピーされます。2 番目のケースでは、1 つの割り当て + すべての要素をゼロに初期化するための 1 つのパスと、データをコピーするための別のパスがあります。C++11 の移動セマンティクスは最初のケースに適用され、データをコピーするために 1 つの割り当てと 1 つのパスのみが必要になりますか?

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

c++ - POD C スタイルの配列を std::valarray に置き換えるのは悪い考えですか?

私が扱っているコード ベースは、記述が不十分でメモリ リークが多いコード ベースです。

主に動的配列として使用される生のポインターを含む多くの構造体を使用します。

多くの場合、構造体は関数間で渡されますが、これらのポインターの割り当てと割り当て解除はランダムな場所に配置され、簡単に追跡/推論/理解することはできません。

それらのいくつかをクラスに変更し、それらのポインターをクラス自体によってRAIIされるようにしました。それらはうまく機能し、実装に時間を費やしたくないという理由だけで、これらのクラスのコピー構成とコピー代入を禁止したことを除けば、見栄えも悪くありません。

今私は考えています、私は車輪を再発明していますか?C スタイルの配列を std:array または std::valarray に置き換えてみませんか?

ヒープメモリと RAIIed を使用するため、std::valarray をお勧めします。std::array は、私の開発環境では (まだ) 利用できません。

Edit1 : std::array のもう 1 つのプラスは、これらの動的配列の大部分が POD (ほとんどが int16_t、int32_t、および float) 配列であり、数値 API によって作業が楽になる可能性があることです。

始める前に知っておくべきことはありますか?

私が考えることができる 1 つは、std::valarray または std::array を C スタイルの配列に変換する簡単な方法がない可能性があり、コードの一部はポインター演算を使用しており、データをプレーンな C として表示する必要があるということです。スタイルの配列。

他に何か?

編集2

最近この質問に出会いました。非常に悪い点std::valarrayは、C++11 まで安全にコピー代入できないことです。

その回答で引用されているように、C++03 以前では、ソースと宛先のサイズが異なる場合は UB です。

0 投票する
2 に答える
1985 参照

c++ - メンバー初期化リストによる構造体の初期化

それで、Stephen Prata の本から C++ を学んでいて、1 つの演習を行いたいと思っています...問題は次のとおりです。

次のようなクラス内で、構造体内で std::valarray を使用したい:

そして、メンバー初期化リストを介してこれを初期化します。

しかし、それはうまくいきたくないだけです。どういうわけか、コンパイラはこの "." を好みません。初期化子リスト内のm_numericData構造体のメンバーにアクセスします。

Pair構造体を放棄して、単純なクラス メンバー変数としてvalYearvalBottlesNumを実行し、次のように初期化することもできます...

しかし、私は本当にこのようなものを解決する方法を知りたい.

よろしくお願いします!