Namespaces
Variants

std::basic_string<CharT,Traits,Allocator>:: reserve

From cppreference.net
std::basic_string
(1)
void reserve ( size_type new_cap = 0 ) ;
(C++20まで)
constexpr void reserve ( size_type new_cap ) ;
(C++20から)
void reserve ( ) ;
(2) (C++20から)
(C++20で非推奨)
(C++26で削除)
1) std::basic_string オブジェクトに予定されているサイズ変更を通知し、ストレージの割り当てを適切に管理できるようにする。
  • new_cap が現在の capacity() より大きい場合、新しいストレージが割り当てられ、 capacity() new_cap 以上になる。
  • new_cap が現在の capacity() より小さい場合、これは非拘束的な縮小リクエストとなる。
  • new_cap が現在の size() より小さい場合、これは非拘束的なshrink-to-fitリクエストとなり shrink_to_fit() と等価 (C++11以降)
(C++20以前)
  • new_cap が現在の capacity() 以下である場合、何も影響しない。
(C++20以降)
容量変更が発生した場合、すべてのイテレータと参照(末尾イテレータを含む)は無効化されます。
2) 非拘束的な縮小要求。この呼び出しの後、 capacity() size() 以上の未規定の値を返す。

目次

パラメータ

new_cap - 文字列の新しい容量

戻り値

(なし)

例外

std::length_error をスローする( new_cap max_size() より大きい場合)。

std:: allocator_traits < Allocator > :: allocate ( ) によってスローされる例外( std::bad_alloc など)をスローする可能性があります。

何らかの理由で例外がスローされた場合、この関数は何も効果を持ちません( strong exception safety guarantee )。

計算量

文字列の size() に対して最大で線形。

#include <cassert>
#include <iostream>
#include <string>
int main()
{
    std::string s;
    std::cout << "1) 初期状態: " << s.capacity() << '\n';
    const std::string::size_type new_cap{101u};
    s.reserve(new_cap);
    assert(s.capacity() >= new_cap);
    std::cout << "2) reserve(" << new_cap << ") 実行後: " << s.capacity() << '\n';
    // 容量増加率の観察
    auto cap{s.capacity()};
    for (int check{}; check != 4; ++check)
    {
        while (cap == s.capacity())
            s += '$';
        cap = s.capacity();
        std::cout << (3) + check << ") 容量: " << cap << '\n';
    }
//  s.reserve(); // C++20/26 で非推奨/削除、以下を使用:
    s.shrink_to_fit();
    std::cout << "7) shrink_to_fit 実行後: " << s.capacity() << '\n';
}

出力例:

1) 初期状態: 15
2) reserve(101) 実行後: 101
3) 容量: 202
4) 容量: 404
5) 容量: 808
6) 容量: 1616
7) shrink_to_fit 実行後: 809

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 847 C++98 例外安全性保証がなかった 強い例外安全性保証を追加

関連項目

現在割り当てられているストレージに格納可能な文字数を返す
(public member function)
格納されている文字数を変更する
(public member function)