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

2024-03-09

下列的this http://labs.qt.nokia.com/2011/06/13/string-concatenation-with-qstringbuilder/ and this http://doc-snapshot.qt-project.org/4.8/qstring.html#more-efficient-string-construction文档 我会在 for 循环中使用 QStringBuilder。我应该应用它的代码是

QStringList words;
QString testString;

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

但是我不明白如何编写它以使用 QStringBuilder,因为在这里我正在执行一项分配,而 QStringBuilder 要求我使用 % 运算符,并且仅按照文档执行一项分配。


AFAICS here http://qt-project.org/forums/viewthread/16144,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 Measure-Command: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 的情况下执行数千个串联)。但是,像往常一样,您可以衡量执行时间并决定什么最适合您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

for循环中的Qt字符串生成器 的相关文章

  • WebBrowser Control 导致整个应用程序变得无响应

    我有一个带有嵌入式 Web 浏览器的 C NET 3 5 应用程序 浏览器被设计为指向远程站点 而不是本地站点 一切工作正常 但是当页面响应缓慢时 这会导致我的整个应用程序变得无响应 直到加载页面 我不介意浏览器在执行任务时没有响应 但应用
  • C 中的隐秘结构定义

    我遇到了以下情况迷宫定义 https github com gduarte lkb blob master code stack maze h code typedef struct mazeNode int hasCheese int t
  • 以编程方式获取命名管道的系统名称

    我正在使用 WCF NetNamedPipeBinding 编写进程间通信 我的目标是让服务在 net pipe localhost service 上运行 所以我运行最简单的主机 host new ServiceHost contract
  • 获取枚举实例的名称[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 假设我有这个枚举 public enum MyEnum ValueOne 1 ValueTwo 2 ValueThree 3 然后
  • 如何使用c#/VB.NET在word中插入书签

    我正在尝试使用 C 在 Word 文档中添加书签 但它不起作用 而且我在 msdn 文档和互联网上都找不到任何帮助 这就是我正在尝试做的事情 我正在阅读 Word 文档 然后在该文档中搜索关键字 然后将该文本转换为超链接 效果很好 现在 我
  • 在 C 的公共 API 函数中使用枚举参数是个好主意吗?

    我正在设计一个 C API 其中必须提供一种设置一些双值选项的方法 为了识别选项 我使用以下枚举 typedef enum OptionA OptionB Option 使用是一个好主意吗Option作为公共 API 函数中的参数类型 in
  • 为什么在此单元测试中,BackgroundWorker 没有在正确的线程上调用 RunWorkerCompleted?

    backgroundWorker 的全部目的是在执行耗时的任务后更新 UI 组件正如广告所宣传的那样在我的 WPF 应用程序中 但是在我的测试中 回调不会在调用线程上调用 Test public void TestCallbackIsInv
  • MPI_Gather 分段错误

    我有这个并行高斯消除代码 调用以下任一方法时会发生分段错误MPI Gather函数调用 我知道如果没有为任一缓冲区正确分配内存 可能会出现此类错误 但我看不出内存管理代码有什么问题 有人可以帮忙吗 Thanks Notes 该程序从一个 t
  • 清理 STL 指针列表/向量

    您可以想出的最短的 C 块是多少来安全地清理std vector or std list指针 假设您必须对指针调用删除 list
  • esp8266互联网交换机问题

    我正在尝试制作一个门继电器开关系统 我可以通过端口转发从任何地方进行操作 我找到了一个非常有用的指南和代码 我的程序基于 https openhomeautomation net control a lamp remotely using
  • DirectX Vertex 中的 THE 是什么

    我知道 RHW 是倒数同质 W 但有人可以解释一下它的使用方法和作用吗 gamedev论坛上的说明post http www gamedev net topic 440283 reciprocal of homogeneous w and
  • SolrNet:尝试添加和提交时 SolrConnectionException (400) 错误请求

    我已经到了 SolrNet 执行 Add 方法的地步 但是当我尝试 Commit 时 我收到了错误 以下是我的 schema xml 模型 调用它的代码以及我得到的错误 更奇怪的是 尽管出现错误 但在我重新启动 Tomcat 后 该模型仍会
  • 使用 C# 从文本中删除数字

    我有一个要处理的文本文件 其中有一些数字 我只想要其中的文字 而不是其他任何东西 我成功删除了标点符号 但是如何删除数字呢 我想要使 用 C 代码 另外 我想删除长度大于 10 的单词 如何使用 Reg 表达式来做到这一点 您可以使用正则表
  • 确定所选电子邮件是来自收件箱还是已发送邮件

    我正在编程Outlook 插件并需要确定所选电子邮件是否来自Inbox or Sent Items这样当我将电子邮件保存到数据库中时 我可以使用文件夹 收件箱 或 已发送 来标记电子邮件 我知道我可以将文件夹名称与 收件箱 或 已发送邮件
  • try-catch 块是否会降低性能[重复]

    这个问题在这里已经有答案了 This link http www cplusplus com doc tutorial exceptions states 为了捕获异常 我们必须将一部分代码放在异常下 检查 这是通过将这部分代码包含在 tr
  • if(pointerVar) 与 if(pointerVar!=NULL) 相同吗?

    简单的问题 Is if pointerVar 与if pointerVar NULL 也是if pointerVar 与if pointerVar NULL 给我你在技术上最正确 迂腐的答案 这两种说法看起来和操作起来都是一样的 前者有什么
  • C# 从字符串变量中获取类型并在泛型方法中使用它

    我希望能够通过某种方式 即从数据库 获取我收到的字符串值的实际类型 这样我就可以在通用方法中使用该类型 例如DoSomething
  • 无法在 Visual Studio Code 的 C# 输出上键入任何内容

    所以我试图在 vscode 上运行一个非常基本的 C 程序 代码如下 using System namespace HelloWorld class Program static void Main string args string N
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • (int *)0 是空指针吗?

    这可以被认为是一个扩展这个问题 https stackoverflow com q 16563114 912144 我只对 C 感兴趣 但添加 C 来完成扩展 C11 标准 6 3 2 3 3 规定 值为 0 的整数常量表达式 或此类表达式

随机推荐