有几个构造的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
.
这都是猜测,但我会尝试。
如果您已经知道您需要的字符串的大小,您很可能会从其他地方复制数据,例如从另一个字符串。在这种情况下,您可以调用接受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, ' ');
它使“使用填充构造函数是浪费时间”点无效。