2011-03-10 4 views
6

大きなダブルベクトルを割り当てました.100000要素で言うことができます。私のコードのある時点では、すべての要素を一定でゼロ以外の値に設定する必要があります。どのようにして、すべての要素に対してforループを使用せずにこれを行うことができますか? blasパッケージを使用しています。ゼロ以外の値(blas)で二重配列を初期化

答えて

9

あなたはstd::fill#include <algorithm>)を使用することができます

std::fill(v.begin(), v.end(), 1); 

また、これは、本質的に当然のループのみ..です

+0

**特定のタイプとイテレータカテゴリ(それはありそうもないかもしれませんが)で**最適化されるかもしれません。 –

+0

この方法もお勧めします。 –

0

あなたがループにしたくない場合は、いつでもmemset()を使用しています。

つまり、memset(myarr, 5, arrsize);の5つをすべて入力するためです。 unsigned charへの暗黙的な変換に注意してください。

SYNOPSIS

#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が最適化されている に基づいて、最高のアルゴリズムを選択できるようになりました。

+0

-1:彼はダブルベクトルとダブルベクトルのmemsetを持っています(私はそれがベクトルの下の連続した配列であると理解することができます)。 memsetで設定できる値は1バイト(符号なしの文字のサイズ)ですが、設定したい定数は4バイトです –

+0

読み取り中にダブルベクトルを逃しました。もし彼が4bytes全てを満たす必要があれば、それはしません。反対側では、彼はおそらくそれらを "未使用"とマークしたいと思っていて、1バイトはそのトリックをすることができます。 – Milan

+0

私はそれを言及しているOPは表示されません。しかし、彼の質問と正確には、私はstd :: fillは彼の最善の選択だと信じています。 –

3

「塗りつぶし」は、あなたが言った通りです。 「どこかの時点で」「すぐに建設した後、」意味場合

std::vector<double> vec(100000, 3.14); 

ので、代わりにこれを行う:

は、それが指定された値の完全なベクターを構築することも可能だということに注意してください。また、それはあなたがこれを行うことができます意味:

「いくつかの時点で」「すぐにサイズを変更した後」を意味し、あなたがもし、「期待する」(/ベクトルを再割り当てしたい予想される場合に有用であるかもしれない
std::vector<double>(100000, 3.14).swap(vec); 

あなたはそれを以前の容量よりも大きくしています。もしそれをもっと小さくして、メモリを節約するためにトリミングしたいのであれば、「ほしい」です。

関連する問題