サイズがわかっている std::vector<T> を作成するコードがあります。
std::vector<T> vectorOfTs(n);
push_back を呼び出すとサイズが n+1 に増えますか?
vectorOfTs.push_back(T());
サイズがわかっている std::vector<T> を作成するコードがあります。
std::vector<T> vectorOfTs(n);
push_back を呼び出すとサイズが n+1 に増えますか?
vectorOfTs.push_back(T());
はい; vector<T>.capacity()
とは異なりますのでご注意くださいvector<T>.size()
。後者は現在ベクター内にある要素の数を表し、前者はベクターの内部バッファーに現在割り当てられているスペースに収まるアイテムの数を表します。
ほとんど。例外がない場合は、size()
増分します。
push_back(T())
また、さまざまな段階で例外をスローする可能性があります。ここを参照するか、要約すると次のようになります。
T()
建設、その場合、呼び出しpush_back
は行われず、size()
影響を受けません
容量を増やす必要がある場合vector
、それはスローされる可能性があり、その場合size()
は影響を受けません
要素は、vector
を使用して構築されたコピーまたは移動になります。のstd::allocator_traits<A>::construct(m, p, v);
場合、これはplacement-を呼び出します。たとえば、次のようになります。A
std::allocator<T>
new
::new((void*)p) T(v)
vector
size()
noexcept
スローされません。スローされます。この場合、効果は指定されていません。ベクトルの更新はその後完了します-size()
増分され、値はvector
(の場合でもT::~T()
)になります
はい。代わりにスペースを確保したい場合は、reserve() を呼び出します。
std::vector<T> vectorOfTs;
vectorOfTs.reserve(n);
// now size() == 0, capacity() >= n
vectorOfTs.push_back(T());
// now size() == 1
はい。
std::vector<T> vectorOfTs(n);
上記のステートメントでは、実際には、型 T の新しいインスタンスを 'n' 個作成しています (つまり、デフォルトのコンストラクター T() が毎回トリガーされます)。現在、ベクトル vectorOfTs には n 個の要素が含まれています。上記のステートメントに対して、次のバージョンのベクトル コンストラクターが呼び出されます。
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
したがって、別の要素をベクトルにプッシュバックすると、ベクトルのサイズは n+1 になります。