4

サイズがわかっている std::vector<T> を作成するコードがあります。

std::vector<T> vectorOfTs(n);

push_back を呼び出すとサイズが n+1 に増えますか?

vectorOfTs.push_back(T());
4

4 に答える 4

19

はい; vector<T>.capacity()とは異なりますのでご注意くださいvector<T>.size()。後者は現在ベクター内にある要素の数を表し、前者はベクターの内部バッファーに現在割り当てられているスペースに収まるアイテムの数を表します。

于 2010-11-11T09:57:58.627 に答える
10

ほとんど。例外がない場合は、size()増分します。

push_back(T())また、さまざまな段階で例外をスローする可能性があります。ここを参照するか、要約すると次のようになります。

  • T()建設、その場合、呼び出しpush_backは行われず、size()影響を受けません

  • 容量を増やす必要がある場合vector、それはスローされる可能性があり、その場合size()は影響を受けません

  • 要素は、vectorを使用して構築されたコピーまたは移動になります。のstd::allocator_traits<A>::construct(m, p, v);場合、これはplacement-を呼び出します。たとえば、次のようになります。Astd::allocator<T>new::new((void*)p) T(v)vectorsize()

    • 移動コンストラクターはnoexceptスローされません。スローされます。この場合、効果は指定されていません。
  • ベクトルの更新はその後完了します-size()増分さ​​れ、値はvector(の場合でもT::~T())になります

于 2010-11-11T10:19:13.487 に答える
4

はい。代わりにスペースを確保したい場合は、reserve() を呼び出します。

std::vector<T> vectorOfTs;
vectorOfTs.reserve(n);
// now size() == 0, capacity() >= n

vectorOfTs.push_back(T());
// now size() == 1
于 2010-11-11T09:59:40.460 に答える
0

はい。

std::vector<T> vectorOfTs(n);

上記のステートメントでは、実際には、型 T の新しいインスタンスを 'n' 個作成しています (つまり、デフォルトのコンストラクター T() が毎回トリガーされます)。現在、ベクトル vectorOfTs には n 個の要素が含まれています。上記のステートメントに対して、次のバージョンのベクトル コンストラクターが呼び出されます。

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

したがって、別の要素をベクトルにプッシュバックすると、ベクトルのサイズは n+1 になります。

于 2010-11-11T10:46:23.007 に答える