既知のサイズのstd::vector<int>
を作成し、生成された値をすぐに入力したいと考えています。 (1)最初にベクトルをゼロサイズにするか、またはすべての要素にを次にpush_back
を使用して、(2)ベクトルをゼロにすることなくこれを行う方法はありますか? size-1
ただし値0のベクトルを充填する。例えば既知のサイズのベクトルを効率的に取り込みます
:
// method 1
vector<int> fill_resize(int s) {
vector<int> v(s);
for (int i = 0; i < s; i++) {
v[i] = i;
}
return v;
}
// method 2
vector<int> fill_push_back(int s) {
vector<int> v;
v.reserve(s);
for (int i = 0; i < s; i++) {
v.push_back(i);
}
return v;
}
重複ゼロフィリングれる方法(1)廃棄物の時間、及び(2)の方法は、すべてのインサートにpush_back
の機械を必要とします実際にはコンパイルが貧弱です。
誰かがジャンプして「コンパイラがスマートなので、あなたはこれを最適化します」と言います。 - 刃先コンパイラのcheck out the generated assemblyは-O2
です。 push_back
の変種がケーキを大量に取っているので、かなりひどいです。興味深いことに
、ひどいpush_back
バージョンはまだあなたがメモリ帯域幅によって主に制限されているがために、非常に大きなベクトルのための勝利、そしてゼロその後、フィル1は、帯域幅を2倍かかる方法のアプローチを。 push_back
アプローチは、値を1回だけループしますが、低速ループを使用します。あなたはできる
コメントは議論の延長ではありません。この会話は[チャットに移動]されています(http://chat.stackoverflow.com/rooms/138407/discussion-on-question-by-beeonrope-efficiently-populate-vector-of-known-size)。 –