CppDS.com

C++ 98 11 14 17 20 手册

std::vector<T,Allocator>::reserve

来自cppreference.com
< cpp‎ | container‎ | vector
void reserve( size_type new_cap );
(C++20 前)
constexpr void reserve( size_type new_cap );
(C++20 起)

增加 vector 的容量到大于或等于 new_cap 的值。若 new_cap 大于当前的 capacity() ,则分配新存储,否则该方法不做任何事。

reserve() 不更改 vectorsize

new_cap 大于 capacity() ,则所有迭代器,包含尾后迭代器和所有到元素的引用都被非法化。否则,没有迭代器或引用被非法化。

参数

new_cap - vector 的新容量
类型要求
-
T 必须满足可移动插入 (MoveInsertable) 的要求。

返回值

(无)

异常

若抛出异常,则此函数无效果(强异常保证)。

T 的移动构造函数不是 noexcept 且 T 非可复制插入 (CopyInsertable) *this ,则 vector 将使用移动构造函数。若它抛出,则摒弃保证,且效果未指定。

(C++11 起)

复杂度

至多与容器的 size() 成线性。

注解

正确使用 reserve() 能避免不必要的分配,但不适当地使用 reserve() (例如在每次 push_back() 调用前调用它)可能会实际增加重分配的数量(通过导致容量线性而非指数增长)并导致计算复杂度增加,性能下降。例如,按引用接受任意 vector 并后附元素的函数通常应在 vector 上调用 reserve() ,因为它不知道该 vector 的使用特征。

差人范围时, insert() 的范围版本通常更合适,因为它保持正确的容量增长行为,而不同于 reserve() 后随一系列 push_back()

不能用 reserve() 减少容器容量。为该目的提供的是 shrink_to_fit()

示例

#include <cstddef>
#include <new>
#include <vector>
#include <iostream>
 
// 带调试输出的最小 C++11 分配器
template <class Tp>
struct NAlloc {
    typedef Tp value_type;
    NAlloc() = default;
    template <class T> NAlloc(const NAlloc<T>&) {}
    Tp* allocate(std::size_t n)
    {
        n *= sizeof(Tp);
        std::cout << "allocating " << n << " bytes\n";
        return static_cast<Tp*>(::operator new(n));
    }
    void deallocate(Tp* p, std::size_t n)
    {
        std::cout << "deallocating " << n*sizeof(Tp) << " bytes\n";
        ::operator delete(p);
    }
};
template <class T, class U>
bool operator==(const NAlloc<T>&, const NAlloc<U>&) { return true; }
template <class T, class U>
bool operator!=(const NAlloc<T>&, const NAlloc<U>&) { return false; }
 
int main()
{
    int sz = 100;
    std::cout << "using reserve: \n";
    {
        std::vector<int, NAlloc<int>> v1;
        v1.reserve(sz);
        for(int n = 0; n < sz; ++n)
            v1.push_back(n);
    }
    std::cout << "not using reserve: \n";
    {
        std::vector<int, NAlloc<int>> v1;
        for(int n = 0; n < sz; ++n)
            v1.push_back(n);
    }
}

可能的输出:

using reserve: 
allocating 400 bytes
deallocating 400 bytes
not using reserve: 
allocating 4 bytes
allocating 8 bytes
deallocating 4 bytes
allocating 16 bytes
deallocating 8 bytes
allocating 32 bytes
deallocating 16 bytes
allocating 64 bytes
deallocating 32 bytes
allocating 128 bytes
deallocating 64 bytes
allocating 256 bytes
deallocating 128 bytes
allocating 512 bytes
deallocating 256 bytes
deallocating 512 bytes

参阅

返回当前存储空间能够容纳的元素数
(公开成员函数)
返回可容纳的最大元素数
(公开成员函数)
改变容器中可存储元素的个数
(公开成员函数)
通过释放未使用的内存减少内存的使用
(公开成员函数)
关闭