这对你们中的一些人来说可能看起来很无聊,但是对于STL容器,以下哪两种迭代方法更好?为什么?
class Elem; typedef vectorElemVec; ElemVec elemVec; // Method 0 for (ElemVec::iterator i = elemVec.begin(); i != elemVec.end(); ++i) { Elem& e = *i; // Do something } // Method 1 for (int i = 0; i < elemVec.size(); ++i) { Elem& e = elemVec.at(i); // Do something }
方法0似乎更清晰STL,但方法1使用较少的代码实现相同.在容器上简单重复的事情似乎都在以任何源代码的地方.所以,我倾向于选择方法1,这似乎可以减少视觉混乱和代码大小.
PS:我知道迭代器可以做的不仅仅是一个简单的索引.但是,请将回复/讨论集中在如上所示的容器上的简单迭代上.
第一个版本适用于任何容器,因此在将任何容器作为参数的模板函数中更有用.即使对于矢量,它也可以略微提高效率.
第二个版本仅适用于矢量和其他整数索引容器.对于那些容器来说,它更加惯用,C++的新手很容易理解它,如果你需要对索引执行其他操作,这很有用,这种情况并不少见.
像往常一样,我担心没有简单的"这个更好"的答案.
如果你不介意(非常?)小的效率损失,我建议使用Boost.Foreach
BOOST_FOREACH( Elem& e, elemVec ) { // Your code }
方法0更快,因此建议使用.
方法1使用size(),允许为O(1),具体取决于容器和stl实现.