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

标签 c++ qt4 stringbuilder qstring

正在关注 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 和 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 测量命令: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 的情况下执行数千次连接).但是,与往常一样,您需要衡量执行时间并决定最适合您的执行时间。

关于c++ - for循环中的Qt字符串生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12186963/

相关文章:

c++ - 如何创建可调整大小的 Qt 缩略图预览?

c++ - OpenCV模板匹配错误

java - 字符串操作,修改原始字符串的 subString() 方法

c# - HTML 代码到 C# StringBuilder 工具?

c++ - 使用 `memmove` 删除 std::string 的第一个字符

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - Media Foundation - 如何在 MFT(Media Foundation Transform)中更改帧大小

c++ - 在 C++ 中是否有强大的保证交换的工具

c++ - 尝试使用 SDL_WINDOWID 在 QT4 中制作 SDL 小部件,但无法显示小部件

c# - 未捕获的语法错误 : Unexpected identifier in StringBuilder