我经常写这样的东西:
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();
}
}
除了第二个变量end
和it
的名称,到目前为止,我已经给出了不同的名称。在子范围内为另一个变量“重用”相同名称是不好的风格/做法?我知道您将无法访问外部end
和it
变量,但这不是必需的。我不认为这是令人困惑的(奇怪的后缀名称在我眼中是丑陋的),但有没有具体的理由不这样做?
答案 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)
如您所说,在您的案例中重用变量名称的唯一问题是您无权访问外部范围变量。
并不是在你的情况下,但如果你出于不同的目的使用具有相同名称的变量,它实际上可能会降低代码的可读性(在你的情况下它不是问题,因为end
和it
同时工作办法)。
还有第三个问题,即具有相同名称的变量通常会使debuging过程变得困难,但如果您只使用日志记录而不是调试工具,则可能不是您的担忧。
答案 2 :(得分:2)
这取决于背景。在这种情况下,我建议重用it
是值得怀疑的,但end
可能没问题。您只在一个明确的位置使用end
的每个实例。但是读取内部循环的人可能会对你所指的it
感到困惑,因为使用更多地从声明中删除了。
当然,阅读任何一个循环的人可能会对it
开头的含义感到困惑;我会从一开始就选择一个更好的名字,然后重复使用它们应该是一个更罕见的事情。
答案 3 :(得分:1)
我认为重复使用相同的变量名称表示名称对该函数的描述性不够。
如果您要迭代多个容器,变量名称应指明它们正在迭代的内容,或者与容器或容器中包含的类型相关。