是否有c++标准模板库类提供有效的字符串连接功能,类似于c#的StringBuilder或Java的StringBuffer?
当前回答
您可以使用.append()简单地连接字符串。
std::string s = "string1";
s.append("string2");
我认为你甚至可以做到:
std::string s = "string1";
s += "string2";
至于c#的StringBuilder的格式化操作,我相信将snprintf(或者sprintf,如果你愿意冒险编写有bug的代码;-))转换成字符数组并转换回字符串是唯一的选择。
其他回答
您可以使用.append()简单地连接字符串。
std::string s = "string1";
s.append("string2");
我认为你甚至可以做到:
std::string s = "string1";
s += "string2";
至于c#的StringBuilder的格式化操作,我相信将snprintf(或者sprintf,如果你愿意冒险编写有bug的代码;-))转换成字符数组并转换回字符串是唯一的选择。
Std::string的+=不能用于const char*(像“string to add”这样的东西似乎是什么),所以使用stringstream是最接近所需的-你只需使用<<而不是+
因为std::string在c++中是可变的,你可以使用它。它有一个+=运算符和一个附加函数。
如果需要附加数值数据,请使用std::to_string函数。
如果你想更灵活地将任何对象序列化为字符串,那么可以使用std::stringstream类。但是你需要实现你自己的流操作符函数,让它与你自己的自定义类一起工作。
c++的方法是使用std::stringstream或者只是简单的字符串连接。c++字符串是可变的,因此连接的性能考虑不是那么重要。
关于格式化,您可以在流上执行所有相同的格式化,但方式不同,类似于cout。或者你可以使用强类型函子封装这个并提供一个String。格式类似于界面,例如boost:: Format
这个答案最近受到了一些关注。我并不是提倡将其作为一种解决方案(这是我过去在STL之前见过的解决方案)。这是一个有趣的方法,如果你在分析你的代码后发现这样做有改进,那么只应该应用在std::string或std::stringstream上。
我通常使用std::string或std::stringstream。我从来没有遇到过任何问题。如果我事先知道弦的大致大小,我通常会先预留一些空间。
在遥远的过去,我见过其他人制作他们自己优化的字符串构建器。
class StringBuilder {
private:
std::string main;
std::string scratch;
const std::string::size_type ScratchSize = 1024; // or some other arbitrary number
public:
StringBuilder & append(const std::string & str) {
scratch.append(str);
if (scratch.size() > ScratchSize) {
main.append(scratch);
scratch.resize(0);
}
return *this;
}
const std::string & str() {
if (scratch.size() > 0) {
main.append(scratch);
scratch.resize(0);
}
return main;
}
};
它使用两个字符串,一个用于字符串的大部分,另一个用作连接短字符串的划痕区域。它通过将短的追加操作批处理在一个小字符串中,然后将其追加到主字符串中来优化追加,从而减少主字符串变大时所需的重新分配数量。
我对std::string或std::stringstream不需要这个技巧。我认为它是在std::string之前与第三方字符串库一起使用的,这是很久以前的事了。如果您采用这样的策略,则首先对应用程序进行概要分析。
推荐文章
- 自定义c++分配器的引人注目的例子?
- RAII和c++中的智能指针
- 如何构建和使用谷歌TensorFlow c++ api
- 断言是邪恶的吗?
- 下面这些短语在c++中是什么意思:0 -,default-和value-initialization?
- 在STL地图中,使用map::insert比[]更好吗?
- C++ Linux的想法?
- 如何为Fedora安装g++ ?
- Std::cin输入空格?
- c++标准是否要求iostreams的性能很差,或者我只是在处理一个糟糕的实现?
- gcc在哪里查找C和c++头文件?
- 为什么我们需要require require ?
- 解析c++中的命令行参数?
- 我如何在c++中创建一个随机的字母数字字符串?
- c++中的atan和atan2有什么区别?