通常你会发现这样的 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 行整洁。在实际生产代码中使用限定符和成员变量时,如果您使用第一个示例中的样式,则很容易使 really 很长。这就是为什么我在这个例子中故意让它有一个水平滚动条,只是为了让你明白我在说什么。 ;)
另一方面,您突然将 Iter 变量引入 for 循环的外部范围。但是,至少在我工作的环境中,即使在第一个示例中,Iter 也可以在外部范围内访问。
您对此有何看法?除了可能限制Iter的范围之外,第一种风格是否有任何专业人士?
最佳答案
如果您将代码正确地包装成行,则内联表单同样具有可读性。此外,您应该始终将 iterEnd = container.end()
作为优化:
for (SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin(),
IterEnd = m_SomeMemberContainerVar.end();
Iter != IterEnd;
++Iter)
{
}
更新:根据 paercebal 的建议修复了代码。
关于c++ - 循环内的迭代器初始化是否被认为是不好的风格,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/189055/