c++ - 如何在 C++ 中进行快速字符串连接

标签 c++ string

我正在处理长 std::string(std::wstring) 处理

原始字符串的长度可以是10到100万,我得到了一些子字符串的偏移量。我需要的是连接原始字符串的多个子字符串和一些新字符串。

除了使用字符串追加

auto str = new std::string();
str.append(original.substr(a,b)).append(newstr1).append(original.substr(c,d)).append.....

有没有更有效的方法,比如处理指针或字符串迭代器?

谢谢。

更新:

我现在收到了几个反馈,除了绳索我可以测试所有其他方法 结果如下:

#include <string>
#include <iostream>
#include <chrono>
#include <ctime>
std::string GetSystemTimeEpoch(){
    using namespace std::chrono;
    auto now = system_clock::now();
    time_point<system_clock> epoch;
    microseconds ms = duration_cast<milliseconds>(now - epoch);
    double epoch_time = (unsigned long long)ms.count() / 1000000.0;
    unsigned long long postfix = (unsigned long long)ms.count() % 1000000;
    std::time_t   time = static_cast<time_t>(epoch_time);
    std::tm tm = *std::localtime(&time);
    char Buf[80];
    std::strftime(Buf, sizeof(Buf), "%Y-%m-%dT%H:%M:%S", &tm);
    std::string finaltime(Buf);
    return finaltime.append(".").append(std::to_string(postfix));
}

#define TESTLENGTH1 1000000000
#define TESTLENGTH2 300000000
int main(){
    std::string Str(TESTLENGTH2, 'c');
    std::cout << GetSystemTimeEpoch() << " Begin of Method 1(replace)"<< std::endl;
    for (size_t i = 0; i < Str.length(); i++){
        Str.replace(i, 1, "d");
    }
    std::cout << GetSystemTimeEpoch() << " Begin of Method 2(append)" << std::endl;
    std::string NewStr1;
    for (size_t i = 0; i < Str.length(); i++){
        NewStr1.append(Str.substr(i, 1));
    }
    std::cout << GetSystemTimeEpoch() << " Begin of Method 3(+=)" << std::endl;
    std::string NewStr2;
    for (size_t i = 0; i < Str.length(); i++){
        NewStr2 += Str.substr(i, 1);
    }
    std::cout << GetSystemTimeEpoch() << " Begin of Method 4(reserve)" << std::endl;
    std::string NewStr3;
    NewStr3.reserve(TESTLENGTH2);
    for (size_t i = 0; i < Str.length(); i++){
        NewStr3 += Str.substr(i, 1);
    }
    std::cout << GetSystemTimeEpoch() << " End" << std::endl;
    return 0;
}

===

2016-05-21T22:38:51.471000 Begin of Method 1(replace)
2016-05-21T22:38:58.972000 Begin of Method 2(append)
2016-05-21T22:39:14.429000 Begin of Method 3(+=)
2016-05-21T22:39:29.944000 Begin of Method 4(reserve)
2016-05-21T22:39:44.892000 End
Press any key to continue . . .

看来最快的方法不是连接而是替换 用于串联。(方法1)

连接方法(2,3,4)似乎没有区别。

我没有测试过 sgi ROPE 类,因为我找不到初学者文档开始:)。如果有人知道,请留下草图或完成此测试用例。

附言。 TESTLENGTH1 因方法 2、3 和 4 而崩溃

PS2。 测试环境,Win7x64;VC++2013;Target Win32,Release。 i5 2GHz,8GB 内存

最佳答案

来自 SGI 的原始 STL 有一个称为 rope 的数据结构。这存储了一个子序列数组,因此构建新序列的时间复杂度为 O(1)。

参见 this回答。您可以从 here 下载 SGI STL .

关于c++ - 如何在 C++ 中进行快速字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37360823/

相关文章:

c++ - 此代码如何从两个二维 vector 的叉积中检索二维 vector ?

c++ - 使用 Microsoft Visual C++ 构建工具的 CMake

javascript - JS : Using changing String in command after "."

c# - 如何将 html 编码符号转换为它们的实际字符?

arrays - 快速将文本数据读入数组

java计算控制台上打印的字符数以加下划线

c++ - 从包含特定字符串的行开始读取

c++ - 即使 valgrind 没有显示内存泄漏,我是否应该在 c++11 的析构函数中清除 unique_ptr 的 vector

c++ - GLSL 编译失败但没有错误信息

string - 如何找到彼此接近的两个字符串