#include <QStringBuilder>
#include <QStringList>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QStringList words;
words << "a1" << "a2" << "a3";
QString testString;
for (auto it = words.constBegin(); it != words.constEnd(); ++it)
{
testString = testString % *it % " ";
}
cout << testString.toStdString() << endl;
}
还有提到QT_USE_QSTRINGBUILDER
宏,将所有+
用法转换为%
,前提是这不会在您的代码中其他地方引起问题。
编辑:
根据Marvin的评论,我认为我应该对我的回答进行一些澄清: 本答案展示了一种在循环中明确使用QStringBuilder和operator%的方法。 QStringBuilder是为了优化连接表达式而创建的,这种优化通过消除临时变量的需求,并计算连接字符串的总大小并同时分配它来实现(显然,这只能在表达式的“结尾”处完成)。
这意味着它的最佳使用可能不在循环中(例如上面的代码)。 但是,即使在这种情况下,它也可以给您一些优化,正如下面两个版本的gprof和Measure-Command输出所示。
版本1 - QStringBuilder和operator%(gprof累积秒:0.46; PowerShell Measure-Command:5:23s)
for (auto it = words.constBegin(); it != words.constEnd(); ++it)
{
for (int i = 0; i < 100000; ++i)
{
testString = testString % *it % " ";
}
}
版本2 - Qstring和operator+(gprof累计秒数:0.61;PowerShell Measure-Command:10:47s)
for (auto it = words.constBegin(); it != words.constEnd(); ++it)
{
for (int i = 0; i < 100000; ++i)
{
testString = testString + *it + " ";
}
}
DEFINES *= QT_USE_QSTRINGBUILDER
QString
,例如使用QString(s1 + s2)
而不是仅仅使用s1 + s2
。而不是仅仅使用
s1 + s2`。 - TotoroTotoroQString
有一个方法reserve()
,它允许提前保留更大的内存空间。例如,在循环中可以粗略估计结果字符串的大小时,这非常有用,因为它可以避免由于不断增长的字符串而导致的常量分配。