当前位置:  开发笔记 > 编程语言 > 正文

Iterator初始化for循环内部是不好的样式,为什么?

如何解决《Iterator初始化for循环内部是不好的样式,为什么?》经验,为你挑选了3个好方法。

通常你会发现这样的STL代码:

for (SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin(); Iter != m_SomeMemberContainerVar.end(); ++Iter)
{
}

但我们实际上有建议像这样写:

SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin();
SomeClass::SomeContainer::iterator IterEnd = m_SomeMemberContainerVar.end();
for (; Iter != IterEnd; ++Iter)
{
}

如果您担心范围,请添加括号:

{
    SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin();
    SomeClass::SomeContainer::iterator IterEnd = m_SomeMemberContainerVar.end();
    for (; Iter != IterEnd; ++Iter)
    {
    }
}

这应该可以提高速度和效率,特别是在编程控制台的情况下,因为在循环的每次迭代中都不会调用.end()函数.我只是把性能提升视为理所当然,这听起来很合理,但我不知道它有多少,它肯定取决于容器的类型和实际使用的STL实现.但是,使用这种风格已经有几个月了,我实际上更喜欢它.

可读性的原因是:for line干净整洁.在实际生产代码预选赛和成员变量这是很容易有长行,如果你在第一个例子中使用的样式.这就是为什么我故意让它在这个例子中有一个水平滚动条,只是让你看到我在说什么.;)

另一方面,您突然将Iter变量引入for循环的外部范围.但是,至少在我工作的环境中,即使在第一个例子中,也可以在外部范围内访问Iter.

你对此有什么看法?除了可能限制Iter的范围之外,还有第一种风格的专业人士吗?



1> Ates Goral..:

如果将代码正确地包装成行,则内联表单将具有相同的可读性.此外,你应该总是做iterEnd = container.end()一个优化:

for (SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin(),
    IterEnd = m_SomeMemberContainerVar.end();
    Iter != IterEnd;
    ++Iter)
{
}

更新:根据每个paercebal的建议修复代码.



2> joeld..:

另一种方法是使用foreach宏,例如boost foreach:

BOOST_FOREACH( ContainedType item, m_SomeMemberContainerVar )
{
   mangle( item );
}

我知道在现代c ++中不鼓励使用宏,但是直到auto关键字被广泛使用,这才是我发现的最简单和可读的东西,并且仍然完全是类型安全和快速的.您可以使用任何初始化样式来实现宏,从而获得更好的性能.

在链接页面上还有一个关于重新定义BOOST_FOREACH作为foreach的注释,以避免烦人的全部大写.



3> Ferruccio..:

如果在for循环之后不需要迭代器,则第一种形式(for循环内部)会更好.它将其范围限制为for循环.

我非常怀疑任何一种方式都可以提高效率.使用typedef也可以使其更具可读性.

typedef SomeClass::SomeContainer::iterator MyIter;

for (MyIter Iter = m_SomeMemberContainerVar.begin(); Iter != m_SomeMemberContainerVar.end(); ++Iter)
{
}

我会推荐更短的名字;-)

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有