对于通常在嵌套范围中重新出现的变量类型使用相同的名称

时间:2011-06-17 17:30:11

标签: c++ for-loop iterator c++11

我经常写这样的东西:

const auto end = some_container.end();
for( auto it = some_container.begin(); it != end; ++it )
{
    const auto &item_container = *it;
    const auto end = item_container.end()
    for( auto it = item_container.begin(); it != end; ++it )
    {
        do_awesome_stuff_with_the_iterator();
    }
}

除了第二个变量endit的名称,到目前为止,我已经给出了不同的名称。在子范围内为另一个变量“重用”相同名称是不好的风格/做法?我知道您将无法访问外部endit变量,但这不是必需的。我不认为这是令人困惑的(奇怪的后缀名称在我眼中是丑陋的),但有没有具体的理由不这样做?

4 个答案:

答案 0 :(得分:3)

由于您标记为c++0x,为什么不简单地将std::foreach()与lambda函数一起使用?

我没有一个支持lambda的编译器,但是这样的事情应该这样做:

// Beware, brain-compiled code ahead!
std::foreach( some_container.begin()
            , some_container.end()
            , [](some_element& v) {
              std::foreach( v.begin()
                          , v.end()
                          , [](another_element& u) {
                            do_awesome_stuff_with_the_element(u);
                          }
            }
            );

然而,使用新的基于范围的for循环,这可能变得更具可读性:

// Beware, brain-compiled code ahead!
for (auto& v: some_container)
    for(auto& u : v)
        do_awesome_stuff_with_the_element(u);

答案 1 :(得分:2)

如您所说,在您的案例中重用变量名称的唯一问题是您无权访问外部范围变量。

并不是在你的情况下,但如果你出于不同的目的使用具有相同名称的变量,它实际上可能会降低代码的可读性(在你的情况下它不是问题,因为endit同时工作办法)。

还有第三个问题,即具有相同名称的变量通常会使debuging过程变得困难,但如果您只使用日志记录而不是调试工具,则可能不是您的担忧。

答案 2 :(得分:2)

这取决于背景。在这种情况下,我建议重用it是值得怀疑的,但end可能没问题。您只在一个明确的位置使用end的每个实例。但是读取内部循环的人可能会对你所指的it感到困惑,因为使用更多地从声明中删除了。

当然,阅读任何一个循环的人可能会对it开头的含义感到困惑;我会从一开始就选择一个更好的名字,然后重复使用它们应该是一个更罕见的事情。

答案 3 :(得分:1)

我认为重复使用相同的变量名称表示名称对该函数的描述性不够。

如果您要迭代多个容器,变量名称应指明它们正在迭代的内容,或者与容器或容器中包含的类型相关。