在 std::string 中连接字符串的选项

Options to concatenate strings in std::string

我需要以高效的方式将多个小字符串连接成一个 std::string

假设有五个字符串 abcdefghilmnpqr。因此需要将它们连接起来:/abc/def/ghi/lmn/pqr

接收字符串的顺序与它们在串联字符串中的最终位置相反:pqrlmnghidefabc.

为了提高这个操作的效率,我使用 std::stringreserve() API 因为我知道所有字符串的大小。

鉴于所有这些,两者中哪一个是有效的:

  1. 使用栈来存储字符串,并通过一个一个地弹出来连接它们。

  2. 使用 std::stringinsert() 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;
}