10

thisthis documentationに従って、QStringBuilder を for ループで使用します。それを適用するコードは

QStringList words;
QString testString;

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

ただし、ここでは割り当てを行っているため、QStringBuilder を使用するように記述する方法がわかりません。代わりに、QStringBuilder では % 演算子を使用し、ドキュメントに従って割り当てを 1 つだけ行う必要があります。

4

3 に答える 3

6

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% を明示的に使用する 1 つの方法を示しています。QStringBuilder は、連結式を最適化するために作成されました。その最適化は、一時変数の必要性を排除し、連結された文字列の合計サイズを計算して一度にすべて割り当てることによって実現されます (明らかに、これは文字列の「最後」でのみ実行できます)。表現)。

これは、その最適な使用法がおそらくループ内ではないことを意味します (上記のコードなど)。ただし、その場合でも、以下の 2 つのバージョンの gprof と Measure-Command の出力からわかるように、ある種の最適化が行われます。

バージョン 1 - QStringBuilder および operator% (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 なしで何千もの連結を実行していない限り、上記の値は少し歪んでいることに注意してください)。ただし、いつものように、実行時間を測定し、何が最適かを判断するのはあなた次第です。

于 2012-08-29T22:04:24.997 に答える
2

私はあなたがラインを持っている限りだと思います

DEFINES *= QT_USE_QSTRINGBUILDER

.pro ファイルでは、コンパイラは QStringBuilder を使用して文字列を連結します。これは Qt 4.8 以降で動作します。

EDIT : Qt のドキュメントによると、このマクロによってプロジェクトのソース互換性が失われる可能性があります。この記事では、それを回避する方法について説明します。基本的に、「+」式の結果を に明示的にキャストする必要があります。QStringたとえば、QString(s1 + s2)の代わりに使用しs1 + s2ます。

于 2012-08-29T21:55:22.097 に答える