Строитель строк Qt в цикле for

после этой и этой документация я бы использовал QStringBuilder в цикле for. Код, к которому я должен применить его, -

QStringList words;
QString testString;

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

однако я не понимаю, как я мог бы написать его, чтобы использовать QStringBuilder, поскольку здесь я делаю назначение, вместо этого QStringBuilder требует от меня использовать оператор % и выполнять только одно назначение после документов.

2 ответов


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 макрос, который превращает все + пользование %, при условии, что не создает проблем в другом месте в коде.

EDIT:

в свете комментария Марвина, я считаю, что должен добавить несколько разъяснений к моему ответу: Этот ответ показывает один из способов явного использования qstringbuilder и оператора% в цикле. 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 и оператор+ (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%, вероятно, не оставит вас заметно хуже (обратите внимание, что вышеуказанные значения немного искажены, если ваше приложение не выполняет тысячи конкатенаций без ввода-вывода вообще). Но, как обычно, это зависит от вас, чтобы измерить время выполнения и решить, что лучше всего работает для вас.


Я думаю, что пока у вас есть строка

DEFINES *= QT_USE_QSTRINGBUILDER

в вашем .pro-файл, компилятор будет использовать QStringBuilder для объединения строк. Это будет работать в Qt 4.8 и выше.

редактировать: документы Qt говорят, что этот макрос может сделать ваш проект несовместимым с исходным кодом. Это статьи говорит о том, как обойти это. В принципе, вам нужно явно привести результат выражения " + " к QString, например, use QString(s1 + s2) вместо просто s1 + s2.