public member function
<vector>

std::vector::reserve

void reserve (size_type n);
请求更改容量
请求 vector capacity 至少能容纳 n 个元素。

如果 n 大于当前的 vector capacity,该函数将导致容器重新分配其存储空间,将其 capacity 增加到 n(或更大)。

在所有其他情况下,函数调用不会导致重新分配,并且 vector capacity 不受影响。

此函数对 vector size 没有影响,也不能更改其元素。

参数

n
vector 的最小 capacity
请注意,结果 vector capacity 可能等于或大于 n
成员类型size_type是一种无符号整型类型。

返回值



如果请求的大小大于最大大小(vector::max_size),则会抛出 length_error 异常。

如果发生重新分配,存储将使用容器的 allocator 进行分配,分配可能会因失败而抛出异常(对于默认 allocatorbad_alloc如果分配请求不成功,则抛出)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// vector::reserve
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int>::size_type sz;

  std::vector<int> foo;
  sz = foo.capacity();
  std::cout << "making foo grow:\n";
  for (int i=0; i<100; ++i) {
    foo.push_back(i);
    if (sz!=foo.capacity()) {
      sz = foo.capacity();
      std::cout << "capacity changed: " << sz << '\n';
    }
  }

  std::vector<int> bar;
  sz = bar.capacity();
  bar.reserve(100);   // this is the only difference with foo above
  std::cout << "making bar grow:\n";
  for (int i=0; i<100; ++i) {
    bar.push_back(i);
    if (sz!=bar.capacity()) {
      sz = bar.capacity();
      std::cout << "capacity changed: " << sz << '\n';
    }
  }
  return 0;
}

可能的输出

making foo grow:
capacity changed: 1
capacity changed: 2
capacity changed: 4
capacity changed: 8
capacity changed: 16
capacity changed: 32
capacity changed: 64
capacity changed: 128
making bar grow:
capacity changed: 100


复杂度

如果发生重新分配,则最多与 vector size 成线性关系。

迭代器有效性

如果发生重新分配,则所有与容器相关的迭代器、指针和引用都将失效。
否则,它们将继续指向调用前它们所指向的相同元素。

数据竞争

如果发生重新分配,则容器及其所有包含的元素都将被修改。
否则,将访问容器,但不会访问其包含的元素:并发访问或修改它们是安全的。

异常安全

如果没有发生重新分配,或者元素的类型具有不抛出异常的移动构造函数或复制构造函数,则在发生异常的情况下容器不会发生变化(强保证)。
否则,容器保证处于有效状态(基本保证)。
如果 n 大于 max_size,则该函数将抛出 length_error

另见