web-dev-qa-db-ja.com

ベクターC ++のMemset

C++のベクトルに対してmemsetの同等の関数はありますか?

clear()またはerase()メソッドではなく、ベクトルのサイズを保持したいのですが、すべての値を初期化したいだけです。)

44
avd

std::fill() を使用:

std::fill(myVector.begin(), myVector.end(), 0);
83
Adam Rosenfield

ベクトルに [〜#〜] pod [〜#〜] タイプが含まれている場合、memsetを使用しても安全です。ベクトルのストレージは連続していることが保証されています。

memset(&vec[0], 0, sizeof(vec[0]) * vec.size());

編集:未定義の用語をスローして申し訳ありません-PODは Plain Old Data を意味します。つまり、 Cおよびそれらから構築された構造。

再度編集:コメントで指摘されているように、boolは単純なデータ型ですが、vector<bool>は興味深い例外であり、memsetを使用しようとすると無残に失敗します。 Adam Rosenfieldの答え はその場合でも完全に機能します。

26
Mark Ransom

別の方法で、私はそれをマイヤーズの本で最初に見たと思います:

// Swaps with a temporary.
vec.swap( std::vector<int>(vec.size(), 0) );

その唯一の欠点は、コピーを作成することです。

2
Tim Finer

ベクトルでassignメソッドを使用できます。

新しいコンテンツをベクターに割り当て、現在のコンテンツを置き換え、それに応じてサイズを変更します(ベクターサイズを変更しない場合は、vec.size()を渡します)。

例えば:

vector<int> vec(10, 0);
for(auto item:vec)cout<<item<<" ";
cout<<endl;
// 0 0 0 0 0 0 0 0 0 0 

// memset all the value in vec to 1,  vec.size() so don't change vec size
vec.assign(vec.size(), 1); // set every value -> 1

for(auto item:vec)cout<<item<<" ";
cout<<endl;
// 1 1 1 1 1 1 1 1 1 1

引用: http://www.cplusplus.com/reference/vector/vector/assign/

1
Jayhello