C++ STL:哪种迭代方法比STL容器更好?

Ash*_*ppa 12 c++ containers iterator stl

这对你们中的一些人来说可能看起来很无聊,但是对于STL容器,以下哪两种迭代方法更好?为什么

class Elem;
typedef vector<Elem> ElemVec;
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
}
Run Code Online (Sandbox Code Playgroud)

方法0似乎更清晰STL,但方法1使用较少的代码实现相同.在容器上简单重复的事情似乎在以任何源代码的地方.所以,我倾向于选择方法1,这似乎可以减少视觉混乱和代码大小.

PS:我知道迭代器可以做的不仅仅是一个简单的索引.但是,请将回复/讨论集中在如上所示的容器上的简单迭代上.

小智 16

第一个版本适用于任何容器,因此在将任何容器作为参数的模板函数中更有用.即使对于矢量,它也可以略微提高效率.

第二个版本仅适用于矢量和其他整数索引容器.对于那些容器来说,它更加惯用,C++的新手很容易理解它,如果你需要对索引执行其他操作,这很有用,这种情况并不少见.

像往常一样,我担心没有简单的"这个更好"的答案.


Ben*_*oît 8

如果你不介意(非常?)小的效率损失,我建议使用Boost.Foreach

BOOST_FOREACH( Elem& e, elemVec )
{
    // Your code
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*fan 6

方法0更快,因此建议使用.

方法1使用size(),允许为O(1),具体取决于容器和stl实现.


Joh*_*web 5

以下迭代标准库容器的方法是最好的。

使用带有说明符的(及更高版本)的基于范围的for循环auto

// Method 2
for (auto& e: elemVec)
{
    // Do something with e...
}
Run Code Online (Sandbox Code Playgroud)

这与您的类似,Method 0但需要更少的输入和维护,并且可以与任何兼容std::begin()和 的容器一起使用std::end()包括普通的旧数组。