在this和本文档之后,我将在for循环中使用QStringBuilder。我应该应用它的代码是
QStringList words;
QString testString;
for (auto it = words.constBegin(); it != words.constEnd(); ++it)
{
testString += "[" + *it + "] ";
}
但是我不明白我怎么可以写它来使用QStringBuilder,因为这里我正在做一个赋值,相反,QStringBuilder要求我使用%运算符,并在文档之后只做一个赋值。
3条答案
按热度按时间r1zhe5dt1#
AFAICS here,QStringBuilder没有运算符%=。
但是,如果你想维护你的循环,你可以尝试这样的操作:
还提到了
QT_USE_QSTRINGBUILDER
宏,它将所有+
的使用转换为%
,前提是不会在代码的其他地方产生问题。编辑:
鉴于Maven的评论,我想我应该在我的回答中补充一些澄清:这个答案显示了在循环中显式使用QStringBuilder和运算符%的一种方法。创建QStringBuilder是为了优化串联表达式,通过消除对临时变量的需求,计算串联字符串的总大小并一次性分配(显然,这只能在表达式的“末尾”完成)来实现优化。
这意味着它的最佳使用可能不是在循环中(如上面的代码)。然而,即使这样,它也为您提供了某种优化,从下面两个版本的gprof和Measure-Command输出中可以看出。
版本1 - QStringBuilder和运算符%(gprof累计秒数:0.46; PowerShell Measure-Command:5分23秒)
版本2 - Qstring和operator+(gprof累积秒数:0.61; PowerShell Measure-Command:10时47分)
所以,我想说,使用QStringBuilder和operator%可能不会让你明显变差(请注意,上面的值有点扭曲,除非你的应用实际上执行了数千个连接而没有任何I/O)。但是,和往常一样,这取决于你自己来衡量你的执行时间,并决定什么最适合你。
hjqgdpho2#
我觉得只要你有台词
在.pro文件中,编译器将使用QStringBuilder连接字符串。这将在Qt 4.8和更高版本中工作。
EDIT:Qt文档说这个宏可能会让你的项目不兼容源代码。这篇article文章讨论了如何解决这个问题。基本上,您需要将“+”表达式的结果显式转换为
QString
,例如:使用QString(s1 + s2)
而不是仅使用s1 + s2
。flvtvl503#
QString
有一个方法reserve()
,它允许提前保留更大的内存部分。这在例如循环中是有用的,当可以粗略估计结果字符串的大小时,因为它可以用于避免由于不断增长的字符串而导致的恒定分配。