用C+;打印向量的所有元素的最佳方法是什么+;? < C++ > 中“将向量的所有元素打印到标准输出”的最有效方法是什么? for(std::vector::iterator it=intVect.begin();it!=intVect.end();++i) std::cout

用C+;打印向量的所有元素的最佳方法是什么+;? < C++ > 中“将向量的所有元素打印到标准输出”的最有效方法是什么? for(std::vector::iterator it=intVect.begin();it!=intVect.end();++i) std::cout,c++,C++,您可以使用 并且依靠其他人的工作来确保它是最佳的。一旦编译器完成了这两行,它们最终将完成基本相同的工作(几乎肯定)。无论采用哪种方式,最终都会使用相同的流,在{begin,end-1}范围内使用迭代器循环相同的代码 这是一个微优化,对您没有多大帮助,但我相信您可以使用大数据集编译它,并在您的平台上轻松查看。如果您询问您发布的哪些方法会更快,唯一有效的答案是: 没有办法确定,因为它们是等价的。您必须同时分析它们并查看它们 为了你自己 这是因为这两种方法实际上是相同的。他们做同样的事情,但他们使用

您可以使用


并且依靠其他人的工作来确保它是最佳的。

一旦编译器完成了这两行,它们最终将完成基本相同的工作(几乎肯定)。无论采用哪种方式,最终都会使用相同的流,在{begin,end-1}范围内使用迭代器循环相同的代码


这是一个微优化,对您没有多大帮助,但我相信您可以使用大数据集编译它,并在您的平台上轻松查看。

如果您询问您发布的哪些方法会更快,唯一有效的答案是:

没有办法确定,因为它们是等价的。您必须同时分析它们并查看它们 为了你自己

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

例如,考虑:

for(std::vector<int>::iterator it = intVect.begin(); it != intVect.end(); ++i)
…仅对其进行一次评估


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


然而,除此之外,还有一个更根本的问题。当你试图做的核心事情相对于你做它的方式来说,一开始可能非常缓慢时,你会问哪种方法做某事更快。如果您使用流写入stdout,那么无论您使用
for
循环还是
std::copy
甚至如果一个比另一个稍微快一点,它对总体执行时间的影响都可以忽略不计。如果您担心的是总体执行时间,那么您可能找错了方向。

您是否无法同时分析这两种情况并比较结果?分析不是问题所在。您真的认为这很重要吗?如果您将数据流输出到一个数据流,那么该操作的开销将使任何循环开销相形见绌。关注易于阅读和维护的清晰简洁的代码。来吧,各位,请关注问题,然后回答。不要试图将其降级为过时,也不要考虑本地超级计算机系统中的服务器。请提供有理由的答案。感谢您是否真的想问,使用手写的
for
循环与使用
std::copy
算法之间是否存在性能影响?+1。我喜欢有人也喜欢这个实用程序。它越来越流行了。祝贺@Kerrek SBI我不确定你的回答是否也构成了对“为什么”的回答,而且对我来说似乎很模糊。@g24l严格地说,这不是你问题的答案,但这是一个建议,建议你如何可以忽略这个困境。谢谢你的道具:-)顺便说一句,欢迎投稿人,特别是对于C++98版本。还有关于我是否正确获得了
begin
/
end
的ADL的评论。@Roman B.这仍然不是一个答案,我不想忽略这个难题,但要澄清它。“它可能被重新编写,以便在for开始时只评估一次”-或者它甚至可能没有被提升,但评估它与检查预先计算的值没有什么不同。不管是哪种方式,发出的代码都可能必须从(堆栈指针)+(编译时已知的小偏移量)加载指针值。@Steve:观察得好,我可以把你的话合并到我的答案中吗?我认为这是带几个星号的正确答案。(1) 在这两种情况下,都有一个循环计算intVect.end(),在这两种情况下,编译器应该对其进行相同的优化。另外cout@g24l:因为,你知道,大多数优化都是完全先验的。(提示:讽刺)这与个人风格无关,一切都与行之有效的测试方法有关。你想加快速度吗?通过分析了解如何进行。如果你不想接受别人的答案,为什么还要问这个问题呢?不,
copy
几乎肯定是内联的;这是您从分析中知道的事情之一。@GMan:您声称“for循环”生成的代码比copy()的代码大?我希望不是。另外,关于评测,它没有什么错,只是它没有回答这个问题。e、 g.一辆汽车需要多少个车轮才能保持稳定?3,4,5. 你的答案是让我们建造所有的汽车,看看哪一辆是稳定的。自上而下和自下而上的方法是有区别的。这两种方法都没有错,但对于无法确定/计算/推断的问题,自下而上是一种方法。请不要再胡闹了。谢谢
std::copy(intVect.begin(), intVect.end(), std::ostream_iterator<int>(std::cout));
for(std::vector<int>::iterator it = intVect.begin(); it != intVect.end(); ++i)
std::copy(intVect.begin(), intVect.end(), std::ostream_iterator<int>(std::cout));