繁体   English   中英

性能 - 使用字符串构造函数与使用串联

[英]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编译了程序。

如果它有帮助,这里是提交(代码) - 失败的 (测试用例:10)和成功的

std::string应该以实现分摊的常量时间的方式分配内存。 一个简单的实现是由每个需要更多空间,时间2倍增长,因为说这里

每当你在内部循环中向你的palindrome_string添加一些内容时,该字符串就有可能重新分配内存。 但是,我不明白这是多么糟糕。 我的意思是,即使上面提到的简单实现在内部循环的迭代中将内存加倍,那么在下一次迭代中,它也不需要再次重新分配空间,对吧?

问题不在于性能,而在于内循环。 j的类型为shortalphabet_count[i]的类型为long ,这就是它发生的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM