c++ - 循环内的迭代器初始化是否被认为是不好的风格,为什么?

标签 c++ stl coding-style iteration iterator

通常你会发现这样的 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/

相关文章:

c++ - STL map 排序

c++ - 如何调整无序的 STL 容器以仅存储键值对的值?

android - 如何在 Android 中动态更改按钮样式?

objective-c - 将委托(delegate)方法放入一个类别中

c++ - BS-42e6.gcno文件调试

c++从另一个字符串中的列表中找到任何字符串

c++ - 与C++中使用push_back相比,声明具有大小的 vector 是否有任何改进?

haskell - 有没有办法在这个算法中不使用显式递归?

c++ - 与 Windows(和 Windows Embedded CE)中的 CLOCK_MONOTONIC 类似的功能

c++ - 使用 std::min_element、std::max_element 查找 vector 中的最小和最大元素