我觉得我在命名和使用迭代器的方式上不专业。我的意思是我“觉得”我应该把它们称为别的东西,但我总是根据“it_”前缀命名它们,过了一会儿,在一个长函数中,名字开始看起来都一样
另外,我总是想知道我是否因为我不知道更好而以一种“奇怪”的方式做事。例如,如果我在迭代地图以显示其所有键/值对,我会这样做:
map<int, int>::const_iterator it = layout.begin(); for (; it != layout.end(); ++it) { cout << it->first << ":\t" << it->second << "\n"; }
我看到有些人称他们的迭代器“iter” - 我看到了其他循环方式。是否有任何超越风格的惯例,只是一种好的做法?
答案 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
循环的规范方法是在第一个语句中计算it
和end
。
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)
这个名字对我来说是最不重要的,只要它清楚明确并且选择得当。
这属于变量命名的无休止争论