在C ++中命名和使用迭代器的常规约定是什么?

时间:2010-09-29 23:23:32

标签: c++ naming-conventions iterator

我觉得我在命名和使用迭代器的方式上不专业。我的意思是我“觉得”我应该把它们称为别的东西,但我总是根据“it_”前缀命名它们,过了一会儿,在一个长函数中,名字开始看起来都一样

另外,我总是想知道我是否因为我不知道更好而以一种“奇怪”的方式做事。例如,如果我在迭代地图以显示其所有键/值对,我会这样做:

map<int, int>::const_iterator it = layout.begin();
for (; it != layout.end(); ++it)
{
   cout << it->first << ":\t" << it->second << "\n";
}

我看到有些人称他们的迭代器“iter” - 我看到了其他循环方式。是否有任何超越风格的惯例,只是一种好的做法?

6 个答案:

答案 0 :(得分:4)

我尝试尽可能地在for循环中声明迭代器,以便最小化迭代器标识符的范围。

首先,我typedef将“长”类型命名为“更短”和可重复使用的类型:

typedef std::map< int, int > IntMap;
typedef IntMap::const_iterator IntMapConstIter;

然后,我做

for( IntMapConstIter it = layout.begin(); it != layout.end(); ++it ) {
    ....
}

答案 1 :(得分:2)

我这样做如下

for (map<int, int>::const_iterator it = layout.begin();
     it != layout.end(); ++it)
{
    cout << it->first << ":\t" << it->second << "\n";
}

由于迭代器的作用域只在块内部,这样可以更简单地为它命名。

答案 2 :(得分:2)

我很确定没有任何惯例超越这个问题的风格。我相信迭代器命名最重要的部分是在第二部分(考虑到你决定添加一个前缀,它应该是“it”还是“iter_”或其他任何东西)。仔细选择第二部分就像对待任何其他变量一样,你会没事的。

答案 3 :(得分:1)

建议使用BOOST_FOREACH并且(主要)忘记迭代器是否完全不合理?

答案 4 :(得分:1)

我没见过单一的规范循环。

创建iterator的成本指定为O(1)(与容器的大小相同),但可能会花费,特别是在激活特定调试选项时。

因此,在循环的每次迭代中调用end都是浪费。

编写for循环的规范方法是在第一个语句中计算itend

typedef std::map<int,int> LayoutType;

for (LayoutType::const_iterator it = layout.begin(), end = layout.end();
     it != end; ++it)
{
  // ...
}

我通常 typedef 我的容器,但老实说, typedefing 迭代器没什么意义,它已经在容器中可用并且引入了太多的同义词并没有帮助

此外,它可能是个人怪癖,但在我介绍 typedef 时,我更喜欢说明功能而不是类型。在以后的重构中类型可能会改变,函数不会改变(至少,如果它的话,它将完全不同,所以它将要求完全重写)。

例如,如果你突然喜欢的话:typedef std::unordered_map<int,int> LayoutType?它仍然符合您的需求,您可以在没有重写成本的情况下将其丢弃(假设您使用了typedef)。

答案 5 :(得分:0)

这个名字对我来说是最不重要的,只要它清楚明确并且选择得当。

这属于变量命名的无休止争论

  • m_ for members
  • 会员的下划线
  • 等...