std :: stringstream运算符<<用strcat?

时间:2014-03-20 16:00:46

标签: c++ string std

我刚学会了画家施莱米尔"算法(http://en.wikipedia.org/wiki/Joel_Spolsky#Schlemiel_the_Painter.27s_algorithm)并意识到我可能是施莱米尔。

在我的代码中,我使用std::stringstream&#39; s operator<<进行了很多字符串连接。我很尴尬地得知,与strcat大量使用c式连接的效率非常低。

C ++ std::stringstream&#39; operator<<是否使用strcat?或者它使用更有效的方法?

1 个答案:

答案 0 :(得分:2)

ostringstreamstringbuf支持,该streambuf继承自ostringstream;写入streambuf时,您正在写入ostringstream受控输出序列。根据27.6.2:

  

2 - 每个序列的特征在于三个指针[...]

     
      
  • 开始指针,或数组[...]
  • 中的最低元素地址   
  • 下一个指针,或者是当前候选读取或写入的下一个元素地址[...]
  •   
  • 结束指针,或超出数组末尾的第一个元素地址[...]
  •   

因此,strlen实际上可以持续访问其输出序列的当前末尾。

请注意,无论如何,在输出序列上使用string::operator+=(const string &)都不起作用,因为允许C ++字符串包含嵌入的空字符。

另请注意,直接字符串连接(ostream)可能比{{1}}运算符更有效,因为不需要通过虚拟方法。