在 std::string 中连接字符串的选项
Options to concatenate strings in std::string
我需要以高效的方式将多个小字符串连接成一个 std::string
。
假设有五个字符串 abc
、def
、ghi
、lmn
和 pqr
。因此需要将它们连接起来:/abc/def/ghi/lmn/pqr
接收字符串的顺序与它们在串联字符串中的最终位置相反:pqr
、lmn
、ghi
、def
和 abc
.
为了提高这个操作的效率,我使用 std::string
的 reserve()
API 因为我知道所有字符串的大小。
鉴于所有这些,两者中哪一个是有效的:
使用栈来存储字符串,并通过一个一个地弹出来连接它们。
使用 std::string
的 insert()
API 将字符串的其余部分移动到开头以容纳新字符串。
请注意,要连接的字符串数量最多可达两千个。
只是出于好奇写了这个程序来查看 运行 Debian 上各种方法的使用时间。逆序添加100,000个单词
stack 是其中最好的选择
// 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;
}
我需要以高效的方式将多个小字符串连接成一个 std::string
。
假设有五个字符串 abc
、def
、ghi
、lmn
和 pqr
。因此需要将它们连接起来:/abc/def/ghi/lmn/pqr
接收字符串的顺序与它们在串联字符串中的最终位置相反:pqr
、lmn
、ghi
、def
和 abc
.
为了提高这个操作的效率,我使用 std::string
的 reserve()
API 因为我知道所有字符串的大小。
鉴于所有这些,两者中哪一个是有效的:
使用栈来存储字符串,并通过一个一个地弹出来连接它们。
使用
std::string
的insert()
API 将字符串的其余部分移动到开头以容纳新字符串。
请注意,要连接的字符串数量最多可达两千个。
只是出于好奇写了这个程序来查看 运行 Debian 上各种方法的使用时间。逆序添加100,000个单词 stack 是其中最好的选择
// 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;
}