考虑我们已经声明了一个这样的字符串: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];
性能中的?我的观点是因为我们经常要达到string
和vector
之间的选择。该程序实际处理或接近的第一个示例是否与其他示例不同?
答案 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做了。