for循环中的Qt字符串构建器

时间:2012-08-29 21:43:42

标签: c++ qt4 stringbuilder qstring

thisthis文档之后,我将在for循环中使用QStringBuilder。我应该应用它的代码是

QStringList words;
QString testString;

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

但是我不明白我是怎么写它来使用QStringBuilder的,因为我在做一个赋值,而QStringBuilder要求我使用%运算符,只在文档后面做一个赋值。

3 个答案:

答案 0 :(得分:5)

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宏,它将所有+用法转换为%,前提是这不会在代码的其他位置产生问题。

编辑:

根据马文的评论,我相信我应该在答案中加上一些澄清: 这个答案显示了一种在循环中显式使用QStringBuilder和operator%的方法。创建QStringBuilder是为了优化连接表达式,并且通过消除临时性的需要,计算连接字符串的总大小并一次性分配它来实现优化(显然,这只能在“结束”的“结束”处完成)表达)。

这意味着它的最佳使用可能不在循环中(例如上面的代码)。但是,即便如此,它也会为您提供某种优化,从下面两个版本的gprof和Measure-Command输出中可以看出。

版本1 - QStringBuilder和operator%(gprof累积秒数:0.46; PowerShell测量命令: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测量命令: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的连接)。但是,像往常一样,由您来衡量执行时间并决定哪些方法最适合您。

答案 1 :(得分:2)

我认为只要你有这条线

DEFINES *= QT_USE_QSTRINGBUILDER
<。>在.pro文件中,编译器会使用QStringBuilder来连接字符串。这将适用于Qt 4.8及以上版本。

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

答案 2 :(得分:0)

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