快速多重替换为字符串

2024-04-10

我有一个如下所示的字符串:

{A}jahshs{b}jwuw{c}wuqjwhaha{d}{e}{f}jsj{g}

我需要更换每一个{x}用不同的字符串。问题来了,因为这个过程将重复大约 1000 次/秒,所以我需要一种优化/快速的方法来完成它。

任何想法?加强替换?升压格式? ETC..


  1. 预分配所有缓冲区

    ....

  2. profit

哦,还有不要发垃圾邮件。 5 10 分钟内的示例代码。

好的,这里是:也住在科里鲁 http://coliru.stacked-crooked.com/a/04acff1610ced10d

#include <string>
#include <sstream>
#include <boost/utility/string_ref.hpp>

template <typename Range>
int expand(Range const& /*key*/)
{
    return rand()%42; // todo lookup value with key (be sure to stay lean here)
}

#include <iostream>
int main()
{
    static const std::string msg_template = "{A}jahshs{b}jwuw{c}wuqjwhaha{d}{e}{f}jsj{g}\n";

    std::ostringstream builder;
    builder.str().reserve(1024); // reserve ample room, not crucial since we reuse it anyways

    for (size_t iterations = 1ul << 14; iterations; --iterations)
    {
        builder.str("");
        std::ostreambuf_iterator<char> out(builder);

        for(auto f(msg_template.begin()), l(msg_template.end()); f != l;)
        {
            switch(*f)
            {
                case '{' : 
                    {
                        auto s = ++f;
                        size_t n = 0;

                        while (f!=l && *f != '}')
                            ++f, ++n;

                        // key is [s,f] now
                        builder << expand(boost::string_ref(&*s, n));

                        if (f!=l)
                            ++f; // skip '}'
                    }
                    break;
                default:
                    *out++ = *f++;
            }
        }
        // to make it slow, uncomment:
        // std::cout << builder.str();
    }
}

这在我的系统上运行大约需要 0.239 秒。大约每秒 68k 扩展.罢工> 哎呀。在releasebuild 它每秒进行 400 万次扩展。在Coliru 达到每秒近 100 万次扩展 http://coliru.stacked-crooked.com/a/d4b19b312b5a570f.

改进空间:

  • 您可以预先验证输入
  • 如果您知道参数键始终为 1 个字母,那么您只需将 string_ref 替换为 char,并且不循环'}'.
  • 您可以预先计算参数的索引并继续前进。这里的好处不是那么确定(顺序内存访问在某些处理器上非常好,并且简单的方法可能会更快)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速多重替换为字符串 的相关文章

  • 在编译时查找数组元素位置

    已编辑 大家好 我有一个元素数组 这些元素在程序的所有执行过程中都不会改变 并且其中的项目可以在自己的数组中包含子元素 我必须在处理数组之前准备好它 但是 因为我知道数组不会改变 所以我想将其声明为const 并在编译时准备所有这些 这样我
  • 使物体跟随旋转且差异很小

    我正在使我的对象跟随另一个对象的旋转 我希望我的对象以很小的差异旋转 也就是说 从当前的旋转来看 它不应该与另一个对象完全旋转 其旋转应该存在差异 使其旋转主要对象旋转的 10 我该怎么做呢 using System Collections
  • Python str.format() 方法的默认 kwarg 值

    我希望尝试使现有字符串的复数化尽可能简单 并且想知道是否有可能得到str format 在查找 kwargs 时解释默认值 这是一个例子 string number of sheep sheep has run away dict comp
  • OpenCV:将垫子除以标量的最简单方法是什么

    我认为标题中已经包含了很多内容 显然我可以迭代和划分 但我认为有一种内置的方法 我看见cvConvertScale但这不适用于类型cv Mat 我知道标量乘法的缩放运算 cv Mat M float alpha cv Mat Result
  • 网络驱动器在启动时不可用

    我有一个 C 应用程序 它在启动时加载 并将数据记录到网络驱动器 该驱动器安装为 X 当机器首次启动时 应用程序会抛出 X 不可用的错误 如果我重新启动应用程序 也会出现同样的错误 但是 如果我打开 Windows 资源管理器并双击浏览驱动
  • 想要使用 C# 列出文件夹中的所有图像文件[重复]

    这个问题在这里已经有答案了 可能的重复 GetFiles 具有多个扩展名 https stackoverflow com questions 3527203 getfiles with multiple extentions 是否有像 Ge
  • 如何使用 iText7 将 .p7s 字节数组插入 PDF 中?

    我正在尝试将 p7s 字节数组信息插入签名字段 我按照下面的图片操作 我的步骤 准备签名容器 原始PDF是 tmp example pdf 这部分的输出是 results prepared pdf PdfSigner signer new
  • 如何唤醒正在休眠的线程?

    我在加载事件中创建了一个线程 如下所示 Thread checkAlert null bool isStop false private void frmMain Load object sender EventArgs e checkAl
  • 使用 Thread.Sleep 等待的替代方法

    首先我不是在问同样的问题C Thread Sleep 的替代方案 https stackoverflow com questions 5450353 c sharp alternative to thread sleep or C 中 Th
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • 如何使用 google test for C++ 来运行数据组合

    我有一个单元测试 需要针对 200 种可能的数据组合运行 生产实现在配置文件中有要测试的数据 我知道如何模拟这些值 我更喜欢为每个组合编写单独的测试用例 并使用某种方式循环数据 有没有使用 Google test for C 的直接方法 您
  • 为什么大多数 STL 实现中的代码如此复杂?

    STL 是 C 世界的重要组成部分 大多数实现都源自 Stepanov 和 Musser 的最初努力 我的问题是考虑到代码的重要性 它是人们出于敬畏和学习目的查看编写良好的 C 示例的主要来源之一 为什么 STL 的各种实现看起来如此令人厌
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • 无效的超链接:格式错误的 URI 作为超链接嵌入到文档中

    我在我的应用程序中使用 OpenXml 命名空间 我用它来读取 Excel 文件中的 XML 这对于某些 Excel 文件工作正常 但在其他文件上我收到运行时错误 无效超链接 格式错误的 URI 作为超链接嵌入到文档中 我在下面一行得到运行
  • 如何在C#中从XML读取键值

    我有下面的 xml 格式文件 名为 ResourceData xml
  • C# 和匿名对象数组

    这样的表达是什么意思呢 obj DataSource new new Text Silverlight Count 10 Link Tags Silverlight new Text IIS 7 Count 11 Link http iis
  • 由于索引无效,无法加载计数器名称数据 -Exception

    我使用 C 和 WPF 操作系统是 windows 7 Professional 和 Visual Studio 2012 SQL Server 2012 我在wpf中使用了Devexpress Grid 我想使用 ADO Net 服务器模
  • 将双精度数转换为十六进制 - 代码审查

    我有以下代码 它采用双精度值并将其转换为十六进制表示形式 反之亦然 我想知道它是否存在任何潜在的问题 我是否忽略了某些事情 double hex to double2 string hexString unsigned char byte
  • Wpf TextBlock 中的垂直文本

    是否可以垂直显示 TextBlock 中的文本 以便所有字母彼此堆叠 不使用 LayoutTransform 旋转 还没有人提到使用纯 XAML 垂直堆叠任意字符串的字母 不旋转它们 的明显而简单的方法
  • 使用 CreateProcessAsUser 和 CreateEnvironmentBlock 创建进程后未设置 Clientname

    我编写了一个在本地系统帐户下运行的 C 服务 当用户登录终端服务器时 我用它来生成一个进程 该服务实现了OnSessionChange方法并接收SessionChangeDescription具有相应SessionID的消息 我使用此 Se

随机推荐

  • 如何获取 PHP 中的 Subversion 修订号?

    我想让我的 PHP 应用程序标有它使用的修订号 但我不想使用巡航控制 http en wikipedia org wiki CruiseControl或每次更新文件并上传 我该怎么做呢 SVN关键字并不是一个好的解决方案 正如其他人指出的那
  • 使用 javascript 创建一个新的空文档

    我正在使用一些非常不直观的 xml 所有标签都是 TX H VC 我想复制这些数据 但将所有标签重命名为它们的实际含义 我可以创建一个新的空文档来放入新的 命名良好的标签吗 我试过这个 doc new DOMParser parseFrom
  • Android:如何将先前的 Activity Intent 传递到列表视图中

    我有两项活动 Activity A Activity B In Activity A我有一个EditText Button and Image View And in 活动B我有一个Listview和 listView 视图包含 Custo
  • Sql 优化:Xml 或分隔字符串

    希望这只是一个简单的问题 涉及 Sql 2008 中的查询时的性能优化 我曾在一些公司工作过 这些公司在 ETL 流程以及一些网站中大量使用存储过程 我见过这样的场景 他们需要根据一组有限的键值检索特定记录 我已经看到它以 3 种不同的方式
  • Firebase 在服务器配置中不断抛出 OAuth2 客户端 ID 未找到

    我正在尝试使用 Firebase 将我的 Google 用户登录到我的应用程序 但每次使用以下方法时 都会收到此错误 An internal error has occured OAuth2 client id in server conf
  • 将 aar 文件发布到 Maven Central,Gradle 不起作用

    将 aar 文件发布到 Maven Central Gradle 仍然无法工作 好吧 让我们重复我遵循的所有步骤来设法 使用 Gradle 将 aar 文件发布到 Maven Central 我主要遵循这个guide https githu
  • 是否可以重定向用户以启动扫描仪应用程序?

    我正在编写一个应用程序来显示上传的文档python3 django 1 8 1 我们还希望允许用户扫描文档 如您所知 javascript 中有一个打印对话框 window print 浏览器是否支持扫描文档 是否可以使用 javascri
  • 在 C++ 中检查向量的所有元素是否相等

    如果我有一个值向量并且想要检查它们是否都相同 那么在 C 中有效执行此操作的最佳方法是什么 如果我用其他语言 例如 R 进行编程 我的想法是仅返回容器的唯一元素 然后如果唯一元素的长度大于 1 我知道所有元素不可能相同 在 C 中 可以这样
  • 如何使用 PHP 创建 .gz 文件?

    我想使用 PHP 在我的服务器上 gzip 压缩文件 有人有一个输入文件并输出压缩文件的例子吗 这段代码可以解决问题 Name of the file we re compressing file test txt Name of the
  • 非常简单的文件附加器日志记录不起作用

    这是我的 web config 信息
  • ScrollView 中的 ViewPager

    我需要有一个ViewPager里面一个ScrollView but ViewPager只是在进入时不会出现ScrollView 当我不使用时一切正常ScrollView 我在 stackoverflow 或其他网站上看到了一些类似的问题 所
  • BASH:如何在循环中创建动态数组名称

    这是我尝试过的 n 0 for i in aaa bbb ccc do array i n date N n done n 0 for i in aaa bbb ccc do echo array i n n done 有什么想法如何使动态
  • 找不到命名空间错误

    我有以下设置 enums ts export enum DocumentType Email 0 Unknown 1 remote ts
  • 用 C 语言实现 FIFO 队列

    对于嵌入式应用程序 我尝试使用 ANSI C 实现先进先出 FIFO 结构队列 最直接的方法似乎是通过实现链表 以便每个结构包含指向队列中下一个的指针 因此我将结构本身定义为 typedef enum LED on LED off etc
  • 错误:尝试使用 id==grid1 注册小部件,但该 id 已注册

    我目前正在开发我的个人网站我对我的网站的一部分有一个偏见 即避免重复代码 这个视图我有一个 dojox grid datagrid 我可以在同一页面中调用此视图两次 ruban phtml 问题是我单击 1 个按钮 这是该视图 部分视图 的
  • 如何在Matlab中找到连通分量?

    数组A 2 3 2 5 4 8 5 6 7 8 我想得到的结果为 conidx 2 3 5 6 和 4 7 8 2 3 的值之一存在于第二行 2 5 的值之一存在于第 4 行 因此 2 3 2 5 和 5 6 连接起来 最后我可以得到连接索
  • 打字稿错误“无法写入文件...因为它会覆盖输入文件。”

    在 Visual Studio 2015 Update 3 中的 Typescript 2 2 1 项目中 我在错误列表中收到数百个错误 例如 无法写入文件 C my project node modules buffer shims in
  • 将图形对象转换为位图

    我的图形对象确实有以下问题 EDIT 我有一个图片框图像 图像RxTx 这是来自摄像机的实时流 我在绘制事件中所做的就是在图像 imageRxTx 上绘制一些线条 下面的代码中未显示 到目前为止 这没有问题 现在我需要检查 imageRxT
  • 如何找到距离原点最近的坐标?

    我知道有很多关于按多个值对 javascript 数组进行排序的问题 但没有一个答案解决了我的问题 我有一个坐标数组 例如 x y 10 20 12 18 20 30 5 40 100 2 如何获取距离原点最近的坐标 使用以下方法计算每个点
  • 快速多重替换为字符串

    我有一个如下所示的字符串 A jahshs b jwuw c wuqjwhaha d e f jsj g 我需要更换每一个 x 用不同的字符串 问题来了 因为这个过程将重复大约 1000 次 秒 所以我需要一种优化 快速的方法来完成它 任何