如何在c ++中添加许多字符串

10 c++ string concat add

据我所知,C++只允许将2个字符串组合在一起,即: s = s1 + s2

但是如何将多个字符串组合在一起呢?喜欢:

s = s1 + s2 + s3 + s4 + ... + sn
Run Code Online (Sandbox Code Playgroud)

cpx*_*cpx 11

如果你试图追加std :: string类的字符串对象,这应该可行.

string s1 = "string1";
string s2 = "string2";
string s3 = "string3";

string s = s1 + s2 + s3;
Run Code Online (Sandbox Code Playgroud)

要么

string s = string("s1") + string("s2") + string("s3") ...
Run Code Online (Sandbox Code Playgroud)

  • +1 - 请记住,当你使用`operator +(std :: basic_string <t>,std :: basic_string <t>)时,你将在C++ 03中产生指数时间.使用`std :: basic_string <t> :: append`成员函数只需要比较线性时间. (7认同)
  • @BillyONeal:你确定它是指数时间吗?看O(N ^ 2)给我. (3认同)
  • 因为您在使用字符串(x)时,所以在x上调用标准字符串类的构造函数.您创建一个临时字符串对象,然后可以使用它的operator +参与.(这种作品就像一种演员表) (2认同)
  • @tsubasa:如果你确定第一项是一个`string`就足够了,所以`string("s1")+"s2"+"s3"`也可以.原因是正常的字符串常量如``s1"`是`const char*`类型,你不能只是将这些指针添加到一起.另一方面,`string`对象知道如何添加`const char*`来形成一个新的`string`.(另外:这里没有什么会使用指数时间,所以不要过于担心) (2认同)

Bil*_*eal 7

首先,你可以做+ sn的事情.虽然假设你在C++ 03上使用字符串,它将采用指数 quadradic(见注释)时间std::basic_string<t>.

您可以使用std::basic_string<t>::appendin con std::basic_string<t>::reserve 来在O(n)时间内连接字符串.

编辑:例如

string a;
//either
a.append(s1).append(s2).append(s3);
//or
a.append("I'm a string!").append("I am another string!");
Run Code Online (Sandbox Code Playgroud)

  • @sth即使没有保留足够的空间,`append`也需要线性摊销时间,这比二次方法要快 (3认同)
  • @BillyONeal:为什么会呈现指数?你提到的总和等于`(0*N + N)+(1*N + N)+(2*N + N)+ ... +((K-1)*N + N)`等于`(1 + 2 + ... +(K-1))*N + K*N` =`(K*(K-1)/ 2)*N + K*N` =`((K ^ 2 + K)/ 2)*N` =`O(K ^ 2*N)`.所以它是"K"部分的数量是二次的.在每个部分中的字符数"N"中,它是线性的. (2认同)

R S*_*hko 5

s = s1 + s2 + s3 + .. + sn;
Run Code Online (Sandbox Code Playgroud)

虽然它可以创建很多临时工作(一个好的优化编译器应该有帮助),但它会有效,因为它将被有效地解释为:

string tmp1 = s1 + s2;
string tmp2 = tmp1 + s3;
string tmp3 = tmp2 + s4;
...
s = tmpn + sn;
Run Code Online (Sandbox Code Playgroud)

保证不创建临时对象的另一种方法是:

s = s1;
s += s2;
s += s3;
...
s += sn;
Run Code Online (Sandbox Code Playgroud)