2017-03-16 6 views
1

既知のサイズの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回だけループしますが、低速ループを使用します。あなたはできる

+0

コメントは議論の延長ではありません。この会話は[チャットに移動]されています(http://chat.stackoverflow.com/rooms/138407/discussion-on-question-by-beeonrope-efficiently-populate-vector-of-known-size)。 –

答えて

3

  • は、独自のベクトル型を作成します。
  • ここに記載されているように(あなたは、配列のサイズを変更する必要はありませんと仮定)unique_ptrを使用します。https://stackoverflow.com/a/15220853/673679
https://stackoverflow.com/a/24852984/673679
  • は、ここに記載されているものと同様空のコンストラクタと、プロキシ整数型を使用してベクトルを記入
  • +0

    ありがとうございます。私は特に軽いので、2番目のアイデアが好きで、新しい実装は必要ありません。 – BeeOnRope

    関連する問題