内部にn個の要素を持つベクトルが必要です(ベクトルの容量ではなくサイズがnであることを意味します)が、作成中にそれらのいずれも初期化したくありません。これを達成する効率的な方法はありますか?
編集:私が想像できるのは、ベクトルにn個の要素があると信じ込ませるために、reserve(n)を使用していくつかのハックを行うことです(誰かが方法を教えてくれます)。または、私は汚水溜めに飛び込んで、malloc と free で踊ります。
パラメーターを受け取るコンストラクターを使用してベクターを構築する場合size
(およびベクターにコピーする要素を指定しない場合)、要素はvalue-initializedになります。値の初期化の規則 (8.5p7) では、プリミティブがゼロで初期化されることが指定されています。
これを回避する唯一の方法は、no-op デフォルト コンストラクターを定義するクラス型でプリミティブをラップすることです。
template<typename T>
struct A {
A() {};
T value;
};
std::vector<A<int>> vec(1000);
初期化プロセスを反復子としてカプセル化できる場合は、反復子を使用してベクトルを構築できます。
std::vector<int> vec(it_begin, it_end);
それ以外の場合は、初期化のオーバーヘッドについてあまり心配しないことをお勧めします。アルゴリズムの複雑さを変えることはありません(とにかく各メンバーにアクセスするため、すでに O(n) になります)。
construct
たとえば、自明なデフォルトの構築可能なタイプの場合、メンバーがノーオペレーションであるアロケータを使用できます。これが何を伴うのか*に注意してください。生成されたコードをプロファイリングおよび/または調べて、その価値があることを確認することをお勧めします。
*:がそのようなアロケータを使用vector_type
する特殊化であると仮定すると、値が指定されていないの要素が読み取られます。これは簡単に失敗する可能性があります。std::vector
vector_type v(42); auto copy = v;
copy
v
std::vector::reserveを使用します。
std::vector big_vec();
big_vec.reserve(100000);
int zeros[n*size(int)/size(T)];
vector<T> big((T*)myints, (T*)myints + n);