初始化迭代器的最佳方法是什么?

时间:2019-03-02 23:45:34

标签: c++ for-loop iterator

当我开始学习C / C ++时,在我的第一堂课中,我了解到在使用代码之前,必须始终声明变量。所以:

int iterator = 0; // with optional initialization of value accordingly with its use.

for (iterator = 0 ; ; ) // your loop

在这种情况下,我们可以根据需要在任意数量的循环中重复使用相同的变量iterator,而无需为每个循环声明一个变量。

但是,最近我发现我们还可以在for循环的内部 声明和初始化变量:

for (int iterator = 0 ; ; ) // your loop

在这种情况下,iterator的范围仅在for循环内。因为它用作迭代器,并且在循环外没有其他用途,所以一旦结束,该变量就会丢失。

哪个会引起我一个问题:初始化迭代器的最佳方法是什么?¹此功能是否有“最佳实践”?

¹=(以最有效的/或资源(RAM)使用率/或最快的计算速度)

2 个答案:

答案 0 :(得分:4)

迭代器一词在C ++中具有特定含义,而这并不是迭代器。通常称为计数器或循环变量。

  

(根据最有效的/或资源(RAM)的使用/或最快的计算)

在上述情况下,这些术语实际上没有任何区别。

通常最好的设计是使变量的范围尽可能小。在这种情况下,可以通过在循环的init-statement中声明计数器来实现。遵循这种经验法则通常可以使编译器更容易地减少内存使用,更重要的是,可以减少需要使用该算法的程序员的认知负担。

有些算法在循环后需要计数器的最终值。可以通过将变量范围提升到循环范围之外来适应这种算法。

答案 1 :(得分:3)

  

¹=(以最有效的/或资源(RAM)使用率/或最快的计算速度)

通常,就这些指标而言,它们是等效的;任何现代的编译器都将在函数入口处静态分配堆栈帧,并跨作用域重用空间。您可以轻松地here看到两个函数生成的代码完全相同。

此外,整数变量不需要任何特殊的初始化 1 ,因此,这与在每个循环中创建新的变量并不意味着运行时会付出任何代价。

因此,作为一个经验法则,您应该套用通常的规则,将每个变量保持在最窄的所需范围内,以减少阅读时的认知负担(您立即知道,该变量仅在内部具有含义该循环,无需担心稍后会使用它的值,无需在寻找它的定义时四处寻找它,并减少了发生错误的风险(例如,稍后不重新初始化它并重新使用其过时的值)。


  1. 与更复杂的类型不同,后者可能为每个实例调用昂贵的构造函数;通常,用于迭代器的类型(例如指针或STL容器迭代器)的构造成本较低。