【问题标题】:What is the best way to initialize an iterator? [closed]初始化迭代器的最佳方法是什么? [关闭]
【发布时间】:2019-07-24 15:23:17
【问题描述】:

当我开始学习 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 的范围仅在 de for 循环内。由于它用作迭代器,在循环之外没有其他用途,一旦结束,变量就丢失了。

这让我产生疑问:初始化迭代器的最佳方式是什么?¹是否有针对此功能的“最佳实践”?

¹ =(就最高效/或资源 (RAM) 使用/或最快计算而言)

【问题讨论】:

  • 没有一种最好的方法。一般来说,最好将变量保持在支持第二种用法的最窄范围内。在实践中,为什么第一个是对于该特定代码最好的原因是有原因的。
  • 所有变量的最佳实践往往是最接近您使用它的位置(因此您不必到处寻找)并且在尽可能窄的范围内(因此它不会'不要污染代码的其他部分)。因此,对于循环迭代器,除非您需要使用循环外的值,例如最终计数,否则将其放入循环中。但是,与其像这样迭代,我可以说服您尽可能使用基于范围的for 吗?
  • "在这种情况下,我们可以将同一个变量迭代器重复用于尽可能多的循环,而无需为每个循环声明一个变量。" Oof;这实际上与你应该做的相反!
  • 在堆栈上声明和使用内置类型(如int)是免费的,因此您不会因为第二种方式而失去任何东西,而且您获得了安全。所以我推荐第二种方式。

标签: c++ for-loop iterator


【解决方案1】:

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

(就最高效/或资源 (RAM) 使用/或最快计算而言)

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

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

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

【讨论】:

    【解决方案2】:

    ¹ =(就最高效/或资源 (RAM) 使用/或最快计算而言)

    一般来说,就这些指标而言,它们是等价的;任何现代编译器都会在函数入口处静态分配堆栈帧并跨范围重用空间。很容易看到here这两个函数生成的代码完全一样。

    此外,整数变量不需要任何特定的初始化1,因此在每个循环中创建新变量并不需要在运行时产生任何成本。

    因此,根据经验,您应该应用通常的规则,将每个变量保持在所需的最窄范围内,以减少阅读时的认知负担(您立即知道此类变量仅在内部有意义该循环,无需担心它的值稍后会被使用,当您查找它的定义时无需四处搜索它)并减少错误的风险(例如以后不重新初始化它并重用它的陈旧值)。


    1. 与更复杂的类型不同,后者可能会为每个实例调用昂贵的构造函数;更一般地说,用于迭代器的类型(无论是指针还是 STL 容器迭代器)构造起来都很便宜。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 2012-01-28
      • 2011-11-18
      • 2016-02-09
      • 2012-02-08
      • 1970-01-01
      • 2017-11-01
      相关资源
      最近更新 更多