【问题标题】:The fastest solution to port the php function addslashes to c++将php函数addlashes移植到c++的最快解决方案
【发布时间】:2011-07-30 13:56:30
【问题描述】:

字符串加斜线(字符串 $str) 返回带有反斜杠的字符串 在需要在数据库查询等中引用的字符之前。 这些字符是单引号 (')、双引号 (")、反斜杠 () 和 NUL(NULL 字节)。

我正在研究这个 php 函数的 c++ 等效项。现在我的函数使用嵌套的替换调用,我将 \ 替换为 \\ 并将 ' 替换为 \'。它一点也不漂亮,而且速度也很慢。

使用标准 c++ 库和函数的最佳解决方案是什么?我的意思是绝对最快的方式。

【问题讨论】:

    标签: c++ addslashes


    【解决方案1】:
    1. 一次性遍历字符串(for 循环)并在每个字符上遍历switch
    2. 遇到需要转义的字符时,将反斜杠推入输出缓冲区
    3. 将当前字符推入输出缓冲区。

    使用std::ostringstream 作为输出缓冲区。

    这是非常有效的(单次通过,缓冲输出)并且易于实现。为了提高效率,直接使用std::string作为输出缓冲区,使用push_backreserve在循环前面添加足够大的容量(例如1.5 * input.length())。

    【讨论】:

    • 这可以通过使输出缓冲区具有正确大小来避免重新分配来加快速度,例如stream.str().reserve(input_len*1.5),如果您预先知道长度。也可以先传递输入以计算输出字符串的长度,然后再传递所需大小的输出。 IDK 如果节省重新分配将补偿第二次传递。
    • @Kos stream.str().reserve(…) 是一个无意义的操作,因为str() 返回一个副本。我不知道如何在stringstream 中预留容量。当然,您可以直接将push_back 转换为具有预留容量的string
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多