0

最初にすべての要素をゼロに初期化せずにstd::vector、初期化されていない(ゼロ以外の)値を使用して、またはジェネレーター(に類似std::generate_n())コンストラクター引数を使用して、目的の非標準(非定数)値を生成する新しいものを作成する方法はありますか?これは、(ランダムな)モックアップ作成APIを可能な限りローカリティ効率の高いものにし、コンテナー要素を1回だけ書き込むためです。(そしておそらく他の人たち)のためのジェネレーターコンストラクターを持っているのは素晴らしいことではないでしょうか?!なぜC++はこれを標準に追加していないのですか?std::vector

次のコンストラクターのようなC関数は、次のカスタム初期化構文に対して私が求める1回限りの書き込み動作を示していますstd::vector

// Allocate-and-Generate a random int array of length \p n.
int * gen_rand(size_t n)
{
  int *v = malloc(n); // allocate only 
  for (size_t i=0; i<n; i++) {
    v[i] = rand(); // first write
  }
}

これは、最初のゼロを書き込む(または書き込まない)責任があるため、使用されるSTLアロケータの動作に要約されると思います。

イテレータでコンストラクタを使用する場合は、std::vector最初にランダムな値を別の場所に割り当てて書き込む必要があります。これは、を使用するよりもさらに悪いことですpush_back()

4

1 に答える 1

3

ジェネレーターを使用する前に、を呼び出すことができますvector::reserve。これは、表示するCコードとまったく同じ動作になります。back_insert_iteratorのサイズはvectorまだゼロであるため、引き続きを使用する必要があります。

#include <vector>
#include <cstdlib>
#include <algorithm>
#include <iterator>
#include <iostream>


int main()
{
  std::vector<int> v;
  v.reserve(10);
  std::generate_n(std::back_inserter(v), 10, []() { return rand(); });
  for(auto x : v)
    std::cout << x << std::endl;
  // unsafe version
  std::vector<int> v2;
  // 10 uninitialized integers
  v2.resize(10);
  // make sure never to write more than the exact amount, otherwise this will be UB
  std::generate_n(v.begin(), 10, []() { return rand(); });

  return 0;
}
于 2012-01-30T00:15:14.750 に答える