C++ 中的字符串拼接

在拼接字符串时,Java 中可以借助 StringBuilder 通过 append 追加新的内容,这样可以更快更节省内存。那么在 c++ 中如何实现呢?

operator +

std::string 的介绍中可以看到 operator+std::string 的非成员函数。 函数原型声明如下:

string operator+ (const string& lhs, const string& rhs);

函数的返回值是 std::string 对象,即每次连接后的字符串都会产生一个新的字符串返回。如果进行大量的字符串拼接时,每次 + 都会产生一个临时对象, 这势必会影响性能。

std::string hello = "hello";
std::string world = "world";
std::string str = hello + world + "test" + "string".

好在 c++11 引入了带右值引用 && 的重载函数,这可以有效的降低临时对象的副作用。

string operator+ (string&& lhs, string&&      rhs);
string operator+ (string&& lhs, const string& rhs);

append

对当前字符串追加新的字符,可以使用 append 函数:

string& append (const string& str);

函数的返回值是对象的引用,可以连续的调用:

std::string str;
str.append("hello").append("world").append("\r\n");

但是,鉴于 append 的重载函数基本都是处理的字符串类型,如果想像 Java 一样用 StringBuilderappend 一个 int 是做不到的。

stringstream

stringstream 借助重载的 operator << 成员函数成为拼接字符串的常用方式。在追加新的字符串时,不用像 snprinf 一样考虑 buffer 的大小, 而且可以把基本数据类型直接转成字符串,大大简化了工作量。

stringstream ss;
ss << "hello " << 123 << " world" << endl;
string str = ss.str();

好工具必定在背后默默做了许多的事情,而这对性能要求比较苛刻的地方可能就不适用。参考 string::append vs stringstream

gutil

google开源了strings工具包,其中 Substitute 的实现很好的结合了 stringstreamsnprintf 的优点,可以像以下的方式拼接字符串:

string str = Substitute("hello $0, welcome to $1.\n", 123, "Beijing");
cout << str;
02 April 2016

blog comments powered by Disqus