我要求以有效的方式将多个小字符串连接成std::string
。
假设有五个字符串abc
,def
,ghi
,lmn
和pqr
。这些需要连接起来:/abc/def/ghi/lmn/pqr
字符串的接收顺序与连接字符串中的最终位置相反:pqr
,lmn
,ghi
,def
和abc
为了使此操作高效,我使用reserve()
std::string
API,因为我知道所有字符串的大小。
鉴于这一切,两者中的哪一个是有效的:
使用堆栈存储字符串并通过逐个弹出来连接它们。
使用insert()
std::string
API移动字符串的其余部分以容纳新字符串。
请注意,要连接的字符串数量最多可达两千个。
答案 0 :(得分:1)
出于好奇,编写了这个程序,以便在Debian上查看各种方法的运行时间。以相反的顺序添加100,000个单词 堆栈是这些
中的最佳选择// concatenate by + operator
real 0m2.286s
user 0m2.268s
sys 0m0.016s
// concatenate by insert
real 0m0.695s
user 0m0.692s
sys 0m0.000s
// concatenate by stack
real 0m0.051s
user 0m0.044s
sys 0m0.004s
#include <cstdio>
#include <iostream>
#include <string>
#include <random>
#include <algorithm>
#include <stack>
using namespace std;
int main() {
random_device dev;
mt19937 gen(dev());
string chars = "abcdefghijklmnopqrstuvwxyz";
uniform_int_distribution<> dis_index(0, chars.size()-1);
int size = 3; // word size
int count = 100000; // 100K words
string out; // final string
stack<string> st;
int i = 0;
while (i < count) {
// create a random word of length = size
string s;
generate_n(back_inserter(s), size, [&](){return chars[dis_index(gen)];});
//cout << s << endl;
// concatenate by + operator
// out = s + out;
// concatenate by insert
// out.insert(0, s);
// concatenate by stack
st.push(s);
++i;
}
while (!st.empty()) {
out += st.top();
st.pop();
}
//cout << out << endl;
}