当我们做cout时会发生什么?

时间:2013-09-15 18:28:11

标签: c++ string vector

考虑我们已经声明了一个这样的字符串:string x;和一个像这样的字符向量:vector<char> x_vec; 我在想是否有任何好处

cout<<x;

for(int i=0;i<x.length();i++)
      cout<<x[i];

或者

for(int i=0;i<x_vec.size();i++)
      cout<<x_vec[i];
性能中的

?我的观点是因为我们经常要达到stringvector之间的选择。该程序实际处理或接近的第一个示例是否与其他示例不同?

3 个答案:

答案 0 :(得分:6)

  

我的观点是因为我们经常要达到字符串和字符向量之间的选择。

经常?我不这么认为。

如果某些内容基本上是字符串,请使用std::string

如果 ,您可以证明性能不是最理想的(通常是通过在真实数据上分析您的程序),那么请考虑替代方案。 std::vector<char>就是这样一种选择,但也有其他选择。哪个(如果有的话)更可取决于实际用例。

在您遇到令人信服的真实案例,将std::string替换为std::vector<char>之前,很可能会有一段时间。

答案 1 :(得分:1)

在所有三种情况下都有一个循环 - 在第一种情况下,它在operator <<的实现内部调用操作系统进行循环,而在另外两种情况下它在你的代码中。

最后两种情况在性能方面是相同的,如果不是在生成代码方面:字符串和向量都使用连续存储,因此它们的operator []非常快。

第一种情况,即循环属于运算符的实现,当实现调用底层操作系统时,可以更好地优化。然而,最重要的一点是可读性:带有简单语句的单行总是比简单的循环读得更好。

一般来说,char s的字符串和向量之间的最大区别是两个容器支持的基元集:字符串用于传达类似字符串的语义(进行子字符串,简单搜索),而向量更好地传达类似数组的语义(快速访问任意索引的项的顺序集合)。在性能方面,这两种结构非常相似。

答案 2 :(得分:1)

使用

有明显的优势
out << str;

通过循环写入字符的循环:格式化的输出运算符,包括char的运算符,为每个输出创建一个std::ostream::sentry对象。此外,由于流不知道您只是在流中写了一个字符,因此需要重新检查其内部状态。如果要分析与上述格式化输出相比的字符序列编写,则应使用类似

的内容
out.write(str.c_str(), str.size());

std::copy(str.begin(), str.end(), std::ostreambuf_iterator<char>(out));

我希望格式化的输出和使用write()的版本具有相同的性能,并且使用std::copy()的版本可能更慢,尽管没有充分的理由它必须比标准C ++库没有创建快速实现的麻烦:我知道它可以有效地完成,主要是因为我为我的experimental standard C++ library implementation做了。