在std :: string

时间:2017-05-05 13:59:28

标签: c++ stdstring

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

假设有五个字符串abcdefghilmnpqr。这些需要连接起来:/abc/def/ghi/lmn/pqr

字符串的接收顺序与连接字符串中的最终位置相反:pqrlmnghidefabc

为了使此操作高效,我使用reserve() std::string API,因为我知道所有字符串的大小。

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

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

  2. 使用insert() std::string API移动字符串的其余部分以容纳新字符串。

  3. 请注意,要连接的字符串数量最多可达两千个。

1 个答案:

答案 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;
}