void reserve(size_type n); // (1) C++03
constexpr void reserve(size_type n); // (1) C++20
概要
capacityを変更する
要件
- 型
T
が*this
に対してムーブ挿入可能であること (C++14)
効果
vector
のサイズが変更されようとしていることを通知し、それによって適宜保持領域の確保を行なわれるようにする。reserve()
呼び出しの後、再確保が行われた場合には、capacity()
はreserve()
の引数より大きいか等しくなる。それ以外の場合には、capacity()
はこの関数の呼び出し前の値と等しくなる。再確保は、現在の容量がreserve()
の引数よりも小さいときに生じ、それ以外の場合には生じない。例外が発生した場合は、非CopyInsertable型のムーブコンストラクタで発生した場合を除き、何も影響を与えない。
戻り値
なし
計算量
シーケンスのサイズは変更されず、最大シーケンスのサイズに対して線形時間の時間がかかる。
例外
n > max_size()
の場合には、length_error
が発生する。また、reserve()
はAllocator::allocate()
を内部的に使用し、これにより何らかの例外が発生することがある。
備考
再確保された場合にはシーケンス中の要素を指す全ての参照、ポインタ、イテレータが無効になる。reserve()
が呼ばれた後は、挿入によってvector
の要素数がcapacity()
の値よりも大きくなるまでは、挿入によって再確保が行われないことが保証されている。
例
#include <iostream>
#include <cassert>
#include <vector>
int main()
{
std::vector<int> v;
v.reserve(5); // 5要素(以上)の領域を事前に確保しておく
assert(v.capacity() >= 5);
// 5要素を超えない限り、要素の追加時にメモリ確保が行われない
v.push_back(1);
v.push_back(2);
v.push_back(3);
for (int x : v) {
std::cout << x << std::endl;
}
}
xxxxxxxxxx
#include <iostream>
#include <cassert>
#include <vector>
int main()
{
std::vector<int> v;
v.reserve(5); // 5要素(以上)の領域を事前に確保しておく
assert(v.capacity() >= 5);
// 5要素を超えない限り、要素の追加時にメモリ確保が行われない
v.push_back(1);
v.push_back(2);
v.push_back(3);
for (int x : v) {
std::cout << x << std::endl;
}
}
出力
1
2
3