Swift array.count是否在循环中每次都得到计算
我想这是一个每种语言都必须问的问题,但当你写作时,例如:Swift array.count是否在循环中每次都得到计算,swift,Swift,我想这是一个每种语言都必须问的问题,但当你写作时,例如: while i < array.count { ... } 是的,每次迭代都会对其进行评估 赋值给一个常数会稍微好一些。然而,有了现代编译器中的所有优化,我就不会麻烦了。除非循环计数非常大 是的,每次迭代都会对其进行评估 赋值给一个常数会稍微好一些。然而,有了现代编译器中的所有优化,我就不会麻烦了。除非循环计数非常大 数组获取计数属性,因为它符合集合。Collection状态下的count文档 复杂性:O(1)如果集合符合
while i < array.count {
...
}
是的,每次迭代都会对其进行评估
赋值给一个常数会稍微好一些。然而,有了现代编译器中的所有优化,我就不会麻烦了。除非循环计数非常大 是的,每次迭代都会对其进行评估
赋值给一个常数会稍微好一些。然而,有了现代编译器中的所有优化,我就不会麻烦了。除非循环计数非常大
数组
获取计数
属性,因为它符合集合
。Collection
状态下的count
文档
复杂性:O(1)如果集合符合RandomAccessCollection;否则,O(n),其中n是集合的长度。
-
由于
Array
也符合RandomAccessCollection
,因此获取数组计数是一个常数时间操作。在开始时获取一次与每次循环迭代之间不应有任何主要性能差异。Array
获取count
属性,因为它符合集合。Collection
状态下的count
文档
复杂性:O(1)如果集合符合RandomAccessCollection;否则,O(n),其中n是集合的长度。
-
由于Array
也符合RandomAccessCollection
,因此获取数组计数是一个常数时间操作。在开始时获取一次与每次循环迭代之间不应该有任何主要的性能差异。while
循环(以及do while
循环)在每次迭代中都对其谓词进行评估
for
循环对序列进行一次评估
下面是一个演示:
var array: [Int]
print("Test Case 1 - while i < array.count")
array = [1, 2, 3, 4, 5, 6]
var i = 0
while i < array.count {
print(array[i])
if i < 3 { array.append(123) }
i += 1
}
print("\r\nTest Case 2 - for i in array.indices")
array = [1, 2, 3, 4, 5, 6]
for i in array.indices {
print(array[i])
if i < 3 { array.append(123) }
}
print("\r\nTest Case 3 - for i in 0 ..< array.count")
array = [1, 2, 3, 4, 5, 6]
for i in 0 ..< array.count {
print(array[i])
if i < 3 { array.append(123) }
}
var数组:[Int]
打印(“测试用例1-当i
测试用例1-当i
一,
二,
三,
四,
五,
六,
123
123
123
测试用例2-针对数组中的i.index
一,
二,
三,
四,
五,
六,
测试用例3-对于0中的i..
一,
二,
三,
四,
五,
六,
while
循环(和do-while
循环)在每次迭代中都对其谓词进行评估
for
循环对序列进行一次评估
下面是一个演示:
var array: [Int]
print("Test Case 1 - while i < array.count")
array = [1, 2, 3, 4, 5, 6]
var i = 0
while i < array.count {
print(array[i])
if i < 3 { array.append(123) }
i += 1
}
print("\r\nTest Case 2 - for i in array.indices")
array = [1, 2, 3, 4, 5, 6]
for i in array.indices {
print(array[i])
if i < 3 { array.append(123) }
}
print("\r\nTest Case 3 - for i in 0 ..< array.count")
array = [1, 2, 3, 4, 5, 6]
for i in 0 ..< array.count {
print(array[i])
if i < 3 { array.append(123) }
}
var数组:[Int]
打印(“测试用例1-当i
测试用例1-当i
一,
二,
三,
四,
五,
六,
123
123
123
测试用例2-针对数组中的i.index
一,
二,
三,
四,
五,
六,
测试用例3-对于0中的i..
一,
二,
三,
四,
五,
六,
是的,每次都有人打电话
让我们运行一个简单的测试,首先我们需要以下数组扩展
extension Array {
var myCustomCount: Int {
print("myCustomCount")
return self.count
}
}
然后我们可以试试这个代码
let nums = [1, 2, 3, 4, 5]
var i = 0
while i < nums.myCustomCount {
i += 1
}
是的,它每次都会被呼叫
让我们运行一个简单的测试,首先我们需要以下数组扩展
extension Array {
var myCustomCount: Int {
print("myCustomCount")
return self.count
}
}
然后我们可以试试这个代码
let nums = [1, 2, 3, 4, 5]
var i = 0
while i < nums.myCustomCount {
i += 1
}
小心下面的for循环。由于elems.count
是在循环顶部构造一次的范围的一部分,因此它只计算一次。当i=4
时,以下代码将失效:
var elems = [1, 2, 3, 4, 5, 6]
for i in 0 ..< elems.count {
if i % 2 == 0 { // remove even elements
elems.remove(at: i)
}
}
var elems=[1,2,3,4,5,6]
对于0中的i..
中的数组.count
,而
确实会在每次评估条件时得到评估。请小心下面的for循环。由于elems.count
是在循环顶部构造一次的范围的一部分,因此它只计算一次。当i=4
时,以下代码将失效:
var elems = [1, 2, 3, 4, 5, 6]
for i in 0 ..< elems.count {
if i % 2 == 0 { // remove even elements
elems.remove(at: i)
}
}
var elems=[1,2,3,4,5,6]
对于0中的i..
数组中的计数
,而
确实会在每次评估条件时得到评估。通常可以完全避免此类显式检查,例如检查数组中的idx。索引
或检查数组中的元素
–即使对于0中的i,。您最好希望每次都计算数组.count
,因为您可能只是在while
循环中从数组中添加和/或删除对象。@rmaddy一些编译器可能会检测到这一点,并相应地更改while
和中的“是”和“否”行为