8
std::vector<int> v1(1000);
std::vector<std::vector<int>> v2(1000);
std::vector<std::vector<int>::const_iterator> v3(1000);

これらの3つのベクトルの要素はどのように初期化されましたか?

intについてテストしたところ、すべての要素が0になることがわかりました。これは標準ですか?プリミティブは未定義のままだと思いました。データの安全性のためにOSメモリがクリアされないように、300000000要素でベクトルを作成し、ゼロ以外の値を指定し、削除して再作成します。再作成されたベクトルの要素も0でした。

イテレータはどうですか?デフォルトのコンストラクターの初期値(0)がありますか、それとも初期値が未定義のままですか?これを確認すると、イテレータは0を指していますが、これはOSである可能性があります

コンストラクターを追跡するための特別なオブジェクトを作成すると、最初のオブジェクトではデフォルトのコンストラクターがベクターで実行され、他のすべてのオブジェクトではコピーコンストラクターが実行されることがわかりました。これは標準ですか?

要素の初期化を完全に回避する方法はありますか?または、独自のベクトルを作成する必要がありますか?(ああ、私はいつも他のベクトルの実装ではないと言います)並列処理で超巨大なスパース行列を使用しているので、push_back()を使用できません。もちろん、無駄な初期化は必要ありません。後で変更します。価値。

4

4 に答える 4

13

このコンストラクターを使用しています(for std::vector<>):

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

次のドキュメントがあります:

反復配列コンストラクター:コンテンツをnのコピーの反復回数に設定してベクトルを初期化しvalueます。

指定しないのでvalue、パラメータのデフォルト値を取りますT()。これはintあなたの場合であり、すべての要素0になります。

于 2012-06-05T22:39:16.067 に答える
5

それらはデフォルトで初期化されます。

intについてテストしたところ、すべての要素が0になることがわかりました。これは標準ですか?プリミティブは未定義のままだと思いました。

いいえ、初期化さ intれていない値は不確定です。これらはデフォルトで初期化されます。

int i;          // uninitialized, indeterminate value
int k = int();  // default initialized, value == 0
于 2012-06-05T22:37:10.710 に答える
5

C ++ 11では、コンストラクターの仕様でvector::vector(size_type n)は、n要素はデフォルトで挿入されるとされています。これは、式によって初期化された要素として定義されていますallocator_traits<Allocator>::construct(m, p)(ここmで、はアロケータタイプでありp、コンテナに格納されているタイプへのポインタです)。デフォルトのアロケータの場合、この式は次のようになります::new (static_cast<void*>(p)) T()(を参照20.6.8.2)。この値-各要素を初期化します。

于 2012-06-05T22:46:43.897 に答える
3

ベクトルの要素はデフォルトで初期化されます。これは、PODタイプの場合、ゼロが初期化されることを意味します。標準のベクトルでそれを回避する方法はありません。

于 2012-06-05T22:35:48.557 に答える