我正在处理长 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 内存
最佳答案
关于c++ - 如何在 C++ 中进行快速字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37360823/