通常你会发现这样的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的范围之外,还有第一种风格的专业人士吗?
如果将代码正确地包装成行,则内联表单将具有相同的可读性.此外,你应该总是做iterEnd = container.end()
一个优化:
for (SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin(), IterEnd = m_SomeMemberContainerVar.end(); Iter != IterEnd; ++Iter) { }
更新:根据每个paercebal的建议修复代码.
另一种方法是使用foreach宏,例如boost foreach:
BOOST_FOREACH( ContainedType item, m_SomeMemberContainerVar ) { mangle( item ); }
我知道在现代c ++中不鼓励使用宏,但是直到auto关键字被广泛使用,这才是我发现的最简单和可读的东西,并且仍然完全是类型安全和快速的.您可以使用任何初始化样式来实现宏,从而获得更好的性能.
在链接页面上还有一个关于重新定义BOOST_FOREACH作为foreach的注释,以避免烦人的全部大写.
如果在for循环之后不需要迭代器,则第一种形式(for循环内部)会更好.它将其范围限制为for循环.
我非常怀疑任何一种方式都可以提高效率.使用typedef也可以使其更具可读性.
typedef SomeClass::SomeContainer::iterator MyIter; for (MyIter Iter = m_SomeMemberContainerVar.begin(); Iter != m_SomeMemberContainerVar.end(); ++Iter) { }
我会推荐更短的名字;-)