【问题标题】:Objective-C can you use fast enumeration in place of "for (i = 0; i < X; i++)"Objective-C 你能用快速枚举代替“for (i = 0; i < X; i++)”吗
【发布时间】:2015-05-12 22:07:48
【问题描述】:

假设我有一个像这样的基本整数迭代:

NSInteger rowCount = self.rowCount;
for (int i = 0; i < rowCount; i++) {
    // stuff!
}

有没有办法使用快速枚举块来实现?我当然可以创建一个整数数组 0 - self.RowCount,但这似乎并不比这样做更高效。

【问题讨论】:

  • // stuff! 发生了什么?
  • 相关。例如,如果您正在初始化一个数组,例如,将其初始化为一个常量值,那么有一些快速的方法可以做到这一点。在一般情况下,不,这个for 循环是最快的(而且很可能,它不会成为瓶颈)。
  • @mipadi 我想知道我是否可以专门使用快速枚举块来做到这一点。要么可以,要么不能。块已经包含枚举所需的位。
  • 如果您的问题是“我如何以最快的方式做到这一点?”那么// stuff!绝对相关的,只要你认为不相关,这个问题就没什么用了。
  • @remus:好吧,在这种情况下,不,递增整数计数器很可能是执行这种 for 循环的最快方法。

标签: objective-c objective-c-blocks fast-enumeration


【解决方案1】:

没有。快速枚举是一种维护迭代状态的技术,这样对集合的迭代效率更高。它克服了许多集合不在 O(1) 中索引的事实,因此通过索引对它们进行迭代将大于 O(N)。由于方法调用的成本(例如objectAtIndex:),即使是在 O(1) 中进行索引的集合也可能会遭受较大的常数时间。如果您查看NSFastEnumeration 协议,您会注意到它依赖于创建高效索引的 C 数组。

增加整数的for 循环(可能会优化到寄存器中)没有相同的问题,并且快速枚举无法提供解决方案。

当然,如果// stuff! 确实包含对self 的索引,那么快速枚举会好得多(而且您根本不应该使用索引),但问题暗示情况并非如此。

【讨论】:

  • 谢谢!简单问题的简单答案。
猜你喜欢
  • 2016-03-18
  • 2016-07-20
  • 2022-12-17
  • 2011-07-27
  • 1970-01-01
  • 2014-09-17
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多