在c++中打印vector的所有元素的最好方法是什么?
what is the best way to print all the elements of a vector in C++?
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}范围内使用相同的流进行循环。
这是一个微优化,不会对你有很大帮助,但我相信你可以用大数据集编译它,并在你的平台上轻松地自己查看。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 通过JNI传递数据数组的最快方法是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在C++中包含原型文件的正确方法是什么?
- 在 OpenCV C++ 中估计基本矩阵之前对相应点进行归一化的正确方法是什么?
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 将一系列整数放入类的最佳方法是什么?
- 从长整整转换为uint64_t的推荐方法是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?