c++ for循环中的Qt字符串生成器

pkmbmrz7  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(160)

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

QStringList words;
QString testString;

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

但是我不明白我怎么可以写它来使用QStringBuilder,因为这里我正在做一个赋值,相反,QStringBuilder要求我使用%运算符,并在文档之后只做一个赋值。

r1zhe5dt

r1zhe5dt1#

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宏,它将所有+的使用转换为%,前提是不会在代码的其他地方产生问题。
编辑:
鉴于Maven的评论,我想我应该在我的回答中补充一些澄清:这个答案显示了在循环中显式使用QStringBuilder和运算符%的一种方法。创建QStringBuilder是为了优化串联表达式,通过消除对临时变量的需求,计算串联字符串的总大小并一次性分配(显然,这只能在表达式的“末尾”完成)来实现优化。
这意味着它的最佳使用可能不是在循环中(如上面的代码)。然而,即使这样,它也为您提供了某种优化,从下面两个版本的gprof和Measure-Command输出中可以看出。
版本1 - QStringBuilder和运算符%(gprof累计秒数:0.46; PowerShell Measure-Command:5分23秒)

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时47分)

for (auto it = words.constBegin(); it != words.constEnd(); ++it)
{
    for (int i = 0; i < 100000; ++i)
    {
        testString = testString + *it + " ";
    }
}

所以,我想说,使用QStringBuilder和operator%可能不会让你明显变差(请注意,上面的值有点扭曲,除非你的应用实际上执行了数千个连接而没有任何I/O)。但是,和往常一样,这取决于你自己来衡量你的执行时间,并决定什么最适合你。

hjqgdpho

hjqgdpho2#

我觉得只要你有台词

DEFINES *= QT_USE_QSTRINGBUILDER

在.pro文件中,编译器将使用QStringBuilder连接字符串。这将在Qt 4.8和更高版本中工作。

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

flvtvl50

flvtvl503#

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

相关问题