3

内部にn個の要素を持つベクトルが必要です(ベクトルの容量ではなくサイズがnであることを意味します)が、作成中にそれらのいずれも初期化したくありません。これを達成する効率的な方法はありますか?

編集:私が想像できるのは、ベクトルにn個の要素があると信じ込ませるために、reserve(n)を使用していくつかのハックを行うことです(誰かが方法を教えてくれます)。または、私は汚水溜めに飛び込んで、malloc と free で踊ります。

4

4 に答える 4

6

パラメーターを受け取るコンストラクターを使用してベクターを構築する場合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) になります)。

于 2012-10-18T12:38:47.093 に答える
0

constructたとえば、自明なデフォルトの構築可能なタイプの場合、メンバーがノーオペレーションであるアロケータを使用できます。これが何を伴うのか*に注意してください。生成されたコードをプロファイリングおよび/または調べて、その価値があることを確認することをお勧めします。

*:がそのようなアロケータを使用vector_typeする特殊化であると仮定すると、値が指定されていないの要素が読み取られます。これは簡単に失敗する可能性があります。std::vectorvector_type v(42); auto copy = v;copyv

于 2012-10-18T12:55:12.597 に答える
-2

std::vector::reserveを使用します。

std::vector big_vec();
big_vec.reserve(100000);
于 2012-10-18T12:14:57.670 に答える
-3
 int zeros[n*size(int)/size(T)];
 vector<T> big((T*)myints, (T*)myints + n);
于 2012-10-18T12:21:11.040 に答える