标准是否保证,如果新的大小与旧的大小相同,std :: string :: resize将不会执行任何操作?

时间:2012-07-09 10:49:30

标签: c++ string resize

正如标题所说:

  

标准是否保证,如果新大小与旧大小相同,std :: string :: resize将不会执行任何操作?

当然,我可以测试它,但它可能是UB,所以测试在这里不起作用。
在cppreference.com和cplusplus.com中,文档对此案例一无所知

示例:

std::string s( "asd" );
// s.size() is 3
s.resize( 3 );    // will this affect **somehow** the string?

2 个答案:

答案 0 :(得分:4)

不,没有保证。实现可以将字符串重新分配到新缓冲区,以减少其capacity()

标准说:

  

效果:更改*this指定的字符串的长度,如下所示:

     

- 如果n <= size(),该函数将*this指定的字符串替换为长度为n的字符串,其元素是*this指定的原始字符串的初始元素的副本。

     

- 如果n > size(),该函数将*this指定的字符串替换为长度为n的字符串,其第一个size()元素是{{1}指定的原始字符串的副本},其余的元素都被初始化为c。

答案 1 :(得分:1)

ISO / IEC 14882:2011(E)§21.4.4:

void resize(size_type n, charT c);

需要: n&lt; = max_size()

抛出: length_error如果n&gt; MAX_SIZE()。

效果:改变* this指定的字符串的长度,如下所示:

  • 如果n&lt; = size(),则该函数用长度为n的字符串替换* this指定的字符串 其元素是由* this指定的原始字符串的初始元素的副本。
  • 如果n> size(),该函数用长度为n的字符串替换* this指定的字符串 其第一个size()元素是由* this指定的原始字符串的副本,其中 剩余的元素都被初始化为c。