Ste*_*ano 9 c++ stringbuilder qstring qt4
按照本文档和本文档,我将在for循环中使用QStringBuilder.我应该应用它的代码是
QStringList words;
QString testString;
for (auto it = words.constBegin(); it != words.constEnd(); ++it)
{
testString += "[" + *it + "] ";
}
Run Code Online (Sandbox Code Playgroud)
但是我不明白如何编写它来使用QStringBuilder,因为我在做一个赋值,而QStringBuilder要求我使用%运算符,并且只在文档后面做一个赋值.
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;
}
Run Code Online (Sandbox Code Playgroud)
还提到了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 % " ";
}
}
Run Code Online (Sandbox Code Playgroud)
版本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 + " ";
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我会说使用QStringBuilder和operator%可能不会让你明显变差(请注意上面的值有点偏差,除非你的应用程序实际上执行了数千个连接而没有任何I/O).但是,像往常一样,由您来衡量执行时间并决定哪些方法最适合您.