为什么std :: string没有保留构造函数?

Dev*_*lus 27 c++ string

有几个构造std::string.我正在寻找一种避免重新分配的方法,我很惊讶有一个填充构造函数,但没有"保留"构造函数.

 std::string (size_t n, char c);
Run Code Online (Sandbox Code Playgroud)

但不是

 std::string (size_t n);
Run Code Online (Sandbox Code Playgroud)

所以我必须reserve()在它已经分配了默认值(在我的情况下是16个字节)之后调用,只是为了立即重新分配它?

有没有这样的构造函数在创建对象时直接保留空间的原因,而不是必须手动执行?或者我错过了什么,有一些方法可以做到这一点?

使用fill构造函数是浪费时间,因为它将遍历内存只是为了被覆盖,并且还会导致错误的大小,因为s.length()报告N而不是0.

Sin*_*all 7

这都是猜测,但我会尝试。

如果您已经知道您需要的字符串的大小,您很可能会从其他地方复制数据,例如从另一个字符串。在这种情况下,您可以调用接受char *const std::string &立即复制数据的构造函数之一。

另外,我不明白为什么reserve在构造字符串后立即使用是一件坏事。虽然它是实现定义的,但我认为它对这段代码有意义:

std::string str;
str.reserve(100);
Run Code Online (Sandbox Code Playgroud)

为总共 100 个元素分配内存,而不是 116 个(如“先分配 16 个,然后释放它们并再分配 100 个”),因此对不存在的保留构造函数没有性能影响。

此外,如果您只想要一个完全没有默认分配的字符串,您大概可以使用std::string str(0, ' ');它使“使用填充构造函数是浪费时间”点无效。

  • `std::string str(0, ' ');` 确实阻止了默认分配(VS2010)。我验证这只是在调试版本中发生,所以它不再是问题,但无论如何,这就是我正在寻找的。 (2认同)