根据thisthis文档,我将在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的情况下执行了数千个串联)。但是,像往常一样,由您自己来衡量执行时间并确定最适合您的方法。

10-08 04:58