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++的新手很容易理解它,如果你需要对索引执行其他操作,这很有用,这种情况并不少见.
像往常一样,我担心没有简单的"这个更好"的答案.
如果你不介意(非常?)小的效率损失,我建议使用Boost.Foreach
BOOST_FOREACH( Elem& e, elemVec )
{
// Your code
}
Run Code Online (Sandbox Code Playgroud)
以下迭代标准库容器的方法是最好的。
使用带有说明符的c++11(及更高版本)的基于范围的for
循环:auto
// Method 2
for (auto& e: elemVec)
{
// Do something with e...
}
Run Code Online (Sandbox Code Playgroud)
这与您的类似,Method 0
但需要更少的输入和维护,并且可以与任何兼容std::begin()
和 的容器一起使用std::end()
,包括普通的旧数组。
归档时间: |
|
查看次数: |
3335 次 |
最近记录: |