gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:08 26 4
gpt4 key购买 nike

我正在处理长 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com