[英]Performance - using string constructor vs using concatenation
我对C ++比较陌生。 我正在练习编码问题,这与将字符串转换为回文有关。
我将字母表的数量存储在一个向量中,然后像这样生成回文 -
string palindrome_string;
for (short i = 0; i < 26; ++i) {
alphabet_count[i] /= 2;
for (short j = 0; j < alphabet_count[i]; ++j)
palindrome_string += string(1, static_cast<char>('a' + i));
}
但对于特定的测试用例(仅包含2.10 ^ 5 e
s的输入),程序超出了256 MB的内存限制。 然后我用这句话替换了内循环 -
palindrome_string += string(alphabet_count[i], static_cast<char>('a' + i));
并且该程序运行良好,仅使用大约2.4 MB。
所以我想问一下这是否与使用串联与构造函数的性能有关,如果是,那么可能的原因是什么?
如果重要,我用MS VC ++ 2010编译了程序。
std::string
应该以实现分摊的常量时间的方式分配内存。 一个简单的实现是由每个需要更多空间,时间2倍增长,因为说这里 。
每当你在内部循环中向你的palindrome_string
添加一些内容时,该字符串就有可能重新分配内存。 但是,我不明白这是多么糟糕。 我的意思是,即使上面提到的简单实现在内部循环的迭代中将内存加倍,那么在下一次迭代中,它也不需要再次重新分配空间,对吧?
问题不在于性能,而在于内循环。 j
的类型为short
而alphabet_count[i]
的类型为long
,这就是它发生的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.