在c++中打印vector的所有元素的最好方法是什么?

what is the best way to print all the elements of a vector in C++?

本文关键字:方法 是什么 元素 c++ 打印 vector      更新时间:2023-10-16

c++中"print the all elements of a vector to standard out"最有效的编码方式是什么?

for(std::vector<int>::iterator it = intVect.begin(); it != intVect.end(); ++i)
std::cout << *it;

std::copy(intVect.begin(), intVect.end(), std::ostream_iterator<int>(std::cout));

,为什么?

可以使用

http://louisdx.github.com/cxx-prettyprint/

并依赖其他人的工作,以确保它将是最优的。

如果你在问你所发布的方法中哪一个会更快,唯一有效的答案可以是:

没有办法确定,因为它们是等价的。你必须对他们俩进行侧写,然后看看为自己。

这是因为这两个方法实际上是相同的。它们做同样的事情,但它们使用不同的机制。当编译器的优化器完成代码时,它可能已经找到了不同的机会来提高执行速度,或者它可能在每个机会中都发现了导致执行相同机器码的机会。

例如:

for(std::vector<int>::iterator it = intVect.begin(); it != intVect.end(); ++i)

乍一看,这似乎有一个内在的低效率,因为intVect.end()是在每个循环中求值的。这将使此方法比

慢。
std::copy(intVect.begin(), intVect.end(), std::ostream_iterator<int>(std::cout));

…只求值一次

但是,根据周围的代码和编译器的设置,它可能会被重写,以便它只在for的开头求值一次。(来源:@SteveJessop)或者它甚至可能没有提升,但评估它与检查预先计算的值没有什么不同。无论哪种方式,发出的代码都可能必须从(堆栈指针)+(编译时已知的小偏移量)加载指针值。唯一确定的方法是编译它们并检查生成的汇编代码。

然而,除此之外还有一个更根本的问题。你在问做某件事的哪种方法更快,而你想做的核心事情一开始就可能很慢,相对于你做这件事的方法来说。如果您使用流写入标准输出,那么无论您使用for循环还是std::copy,甚至如果一个比另一个稍微快一点,则对总体执行时间的影响都可以忽略不计。如果您关心的是总体执行时间,那么您可能找错了对象。

一旦编译器处理完这两行代码,它们将完成本质上相同的事情(几乎可以肯定)。无论哪种方式,你最终都会得到相同的代码,使用迭代器在{begin, end-1}范围内使用相同的流进行循环。

这是一个微优化,不会对你有很大帮助,但我相信你可以用大数据集编译它,并在你的平台上轻松地自己查看。