3

std::string::reserve()引数として渡す正確な量のスペースを割り当てません。たとえば、100 文字のスペースを予約しようとすると、111 文字が予約されます。200 を渡すと、207 が予約されます。650 の場合は 655、1000 の場合は 1007 です。

この背後にある理由は何ですか?

プログラムコード:

std::string mystr;
std::cout << "After creation   :" << mystr.capacity() << std::endl;
mystr.reserve(1000);
std::cout << "After reserve()  :" << mystr.capacity() << std::endl;
mystr = "asd";
std::cout << "After assignment :" << mystr.capacity() << std::endl;
mystr.clear();
std::cout << "After clear()    :" << mystr.capacity() << std::endl;

コード出力:

After creation   :15
After reserve()  :1007
After assignment :1007
After clear()    :1007

(IDE: Visual Studio 2012)

4

3 に答える 3

5

標準では、指定したものを正確に予約する必要はなく、少なくとも指定したものだけを予約する必要があります。

21.4.4 basic_string 容量 [文字列.容量]

12/効果: reserve() の後、capacity() は reserve の引数以上です。[ 注: capacity() よりも小さい res_arg 引数を指定して reserve() を呼び出すことは、事実上、拘束力のない縮小リクエストです。res_arg <= size() での呼び出しは、事実上、拘束力のない縮小して合わせる要求です。—終わりのメモ]

于 2013-07-08T14:34:33.263 に答える