10

按照这个这个文档,我会在 for 循环中使用 QStringBuilder 。我应该应用它的代码是

QStringList words;
QString testString;

for (auto it = words.constBegin(); it != words.constEnd(); ++it)
{
    testString += "[" + *it + "] ";
}

但是我不明白如何编写它来使用 QStringBuilder ,因为我正在做一个赋值,而不是 QStringBuilder 要求我使用 % 运算符并且只在文档之后做一个赋值。

4

3 回答 3

6

AFAICS在这里,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 和 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 + " ";
    }
}

所以,我想说使用 QStringBuilder 和 operator% 可能不会让你明显更糟(请注意,上面的值有点偏差,除非你的应用程序实际上是在没有任何 I/O 的情况下执行数千个连接)。但是,像往常一样,由您来衡量您的执行时间并决定什么对您最有效。

于 2012-08-29T22:04:24.997 回答
2

我想只要你有线

DEFINES *= QT_USE_QSTRINGBUILDER

在您的 .pro 文件中,编译器将使用 QStringBuilder 来连接字符串。这将适用于 Qt 4.8 及更高版本。

编辑:Qt 文档说这个宏可能会使您的项目与源不兼容。本文讨论了如何解决这个问题。基本上,您需要将“+”表达式的结果显式转换为QString,例如 useQString(s1 + s2)而不是 just s1 + s2

于 2012-08-29T21:55:22.097 回答
0

QString有一个方法reserve(),它允许在前面保留更大的内存部分。这在例如可以粗略估计结果字符串大小的循环中很有用,因为它可以用来避免由于字符串不断增长而导致的常量分配。

于 2019-04-27T08:39:47.687 回答