在拼接字符串时,Java 中可以借助 StringBuilder
通过 append
追加新的内容,这样可以更快更节省内存。那么在 c++ 中如何实现呢?
在 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
函数:
string& append (const string& str);
函数的返回值是对象的引用,可以连续的调用:
std::string str;
str.append("hello").append("world").append("\r\n");
但是,鉴于 append
的重载函数基本都是处理的字符串类型,如果想像 Java 一样用 StringBuilder
去 append
一个 int
是做不到的。
stringstream
借助重载的 operator <<
成员函数成为拼接字符串的常用方式。在追加新的字符串时,不用像 snprinf
一样考虑 buffer 的大小,
而且可以把基本数据类型直接转成字符串,大大简化了工作量。
stringstream ss;
ss << "hello " << 123 << " world" << endl;
string str = ss.str();
好工具必定在背后默默做了许多的事情,而这对性能要求比较苛刻的地方可能就不适用。参考 string::append
vs stringstream
google开源了strings工具包,其中 Substitute
的实现很好的结合了 stringstream
和 snprintf
的优点,可以像以下的方式拼接字符串:
string str = Substitute("hello $0, welcome to $1.\n", 123, "Beijing");
cout << str;