大きな double ベクトルを割り当てました。100000 要素としましょう。コードのある時点で、すべての要素をゼロ以外の定数値に設定したいと考えています。すべての要素に対して for ループを使用せずにこれを行うにはどうすればよいですか? 役立つ場合は、blas パッケージも使用しています。
3 に答える
std::fill
( )を使用できます#include <algorithm>
:
std::fill(v.begin(), v.end(), 1);
もちろん、これも基本的にはループにすぎません。
「埋める」はあなたが言ったことから正しいです。
指定された値でいっぱいのベクトルを構築することも可能であることに注意してください。
std::vector<double> vec(100000, 3.14);
したがって、「ある時点で」が「構築直後」を意味する場合は、代わりにこれを行います。また、これは次のことができることを意味します。
std::vector<double>(100000, 3.14).swap(vec);
これは、「ある時点で」が「サイズを変更した直後」を意味し、ベクトルが再割り当てされることを期待/希望する場合に役立ちます (以前の容量よりも大きくする場合は「期待する」、はるかに小さくしており、メモリを節約するためにトリミングしたい)。
memset()
ループしたくない場合は、常に使用します。
つまり、memset(myarr, 5, arrsize);
すべての 5 でそれを埋めるためです。unsigned char への暗黙的な変換に注意してください。
あらすじ
#include <string.h> void * memset(void *b, int c, size_t len);
説明
The memset() function writes len bytes of value c (converted to an unsigned char) to the byte string b.
ベクトルが大きく、高速化する必要があり、gcc を使用している場合は、次のようになります。
ブロック移動 (memcpy) とブロック セット (memset) のコード生成が書き直されました。GCC は、コピーされるブロックのサイズと最適化される CPU に基づいて、最適なアルゴリズム (ループ、展開されたループ、rep プレフィックス付きの命令、またはライブラリ呼び出し) を選択できるようになりました。