C++のベクトルに対してmemset
の同等の関数はありますか?
(clear()
またはerase()
メソッドではなく、ベクトルのサイズを保持したいのですが、すべての値を初期化したいだけです。)
std::fill()
を使用:
std::fill(myVector.begin(), myVector.end(), 0);
ベクトルに [〜#〜] pod [〜#〜] タイプが含まれている場合、memsetを使用しても安全です。ベクトルのストレージは連続していることが保証されています。
memset(&vec[0], 0, sizeof(vec[0]) * vec.size());
編集:未定義の用語をスローして申し訳ありません-PODは Plain Old Data を意味します。つまり、 Cおよびそれらから構築された構造。
再度編集:コメントで指摘されているように、bool
は単純なデータ型ですが、vector<bool>
は興味深い例外であり、memsetを使用しようとすると無残に失敗します。 Adam Rosenfieldの答え はその場合でも完全に機能します。
別の方法で、私はそれをマイヤーズの本で最初に見たと思います:
// Swaps with a temporary.
vec.swap( std::vector<int>(vec.size(), 0) );
その唯一の欠点は、コピーを作成することです。
ベクトルで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/