名前空間
変種
操作

std::vector::reserve

提供: cppreference.com
< cpp‎ | container‎ | vector
 
 
 
 
void reserve( size_type new_cap );

ベクタの容量を new_cap より大きいまたは等しい値に増加させます。 new_cap が現在の capacity() より大きい場合は、新しい記憶域が確保されます。 そうでなければ、この関数は何もしません。

reserve() はベクタのサイズを変更しません。

new_capcapacity() より大きい場合は、すべてのイテレータ (終端イテレータも含む) および要素へのすべての参照が無効化されます。 そうでなければ、どのイテレータも参照も無効化されません。

目次

[編集] 引数

new_cap - ベクタの新しい容量
型の要件
-
TMoveInsertable の要件を満たさなければなりません。

[編集] 戻り値

(なし)

[編集] 例外

  • new_cap > max_size() の場合は std::length_error
  • Allocator::allocate() によって投げられるあらゆる例外 (一般的には std::bad_alloc)。

例外が投げられた場合、この関数は効果を持ちません (強い例外保証)。

T のムーブコンストラクタが noexcept でなく、 T が *thisCopyInsertable でなければ、ベクタは例外を投げるムーブコンストラクタを使用します。 これが例外を投げた場合、保証は断念され、効果は未規定です。 (C++11以上)

[編集] 計算量

多くともコンテナの size() に比例。

[編集] ノート

正しく reserve() を使うと、不要な再確保を防ぐことができますが、不適切に reserve() を使うと (例えば push_back() を呼ぶたびに呼ぶなど)、再確保の回数を実際には増やし (容量を指数的にではなく線形に増やしたことにより)、計算量を増加させ、性能を低下させる結果となる場合があります。 例えば、任意のベクタを参照で受け取る関数は、そのベクタがどのように使われるか知らないため、それに要素を追加するとき、通常、そのベクタに対して reserve() を呼ぶべきではありません

範囲を挿入するとき、一般的には、正しい容量拡張動作を維持するため、 reserve() の後に一連の push_back() を続けるよりも、 insert() の範囲バージョンの方が推奨されます。

reserve() はコンテナの容量を減らすために使用することはできません。 そのためには shrink_to_fit() が提供されています。

[編集]

#include <cstddef>
#include <new>
#include <vector>
#include <iostream>
 
// minimal C++11 allocator with debug output
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*p << " 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

[編集] 関連項目

現在確保されている記憶域に保持できる要素の数を返します
(パブリックメンバ関数) [edit]
可能な最大の要素数を返します
(パブリックメンバ関数) [edit]
格納されている要素の数を変更します
(パブリックメンバ関数) [edit]
未使用のメモリを解放してメモリ使用量を減らします
(パブリックメンバ関数) [edit]