根据this和this文档,我将在for循环中使用QStringBuilder。我应该将其应用的代码是
QStringList words;
QString testString;
for (auto it = words.constBegin(); it != words.constEnd(); ++it)
{
testString += "[" + *it + "] ";
}
但是我不明白如何编写它以使用QStringBuilder,因为在这里我正在做一个赋值,相反,QStringBuilder要求我使用%运算符,并且仅在文档之后执行一个赋值。
最佳答案
AFAICS here,QStringBuilder没有运算符%=。
但是,如果要维护循环,可以尝试执行以下操作:
#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和运算符%(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 + " ";
}
}
因此,我想说使用QStringBuilder和operator%可能不会使您明显恶化(请注意,上述值有些偏斜,除非您的应用程序实际上在没有任何I/O的情况下执行了数千个串联)。但是,像往常一样,由您自己来衡量执行时间并确定最适合您的方法。