Namespaces
Variants

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

From ja.cppreference.net
 
 
 
std::basic_string
 
void reserve( size_type new_cap = 0 );
(1) (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()(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)