如何使布尔数组中的所有值都为真?

Teo*_*aru -1 ios swift

将已定义数组中的所有值设置为trueor的最优雅方法是什么false?我正在考虑不使用for循环。

我目前正在使用仅使用TRUE值重新初始化数组的想法,我很好奇是否存在更好的方法。

Mar*_*n R 5

您可以分配true具有相同元素计数的新值数组:

var array = [true, false, false]

array = Array(repeating: true, count: array.count)
print(array) // [true, true, true]
Run Code Online (Sandbox Code Playgroud)

但有趣的是,true在 for 循环中赋值

for i in array.indices { array[i] = true }
Run Code Online (Sandbox Code Playgroud)

快得多。这是一个简单的基准测试:

let N = 1_000_000

do {
    var array = (1...N).map { _ in arc4random_uniform(2) == 0 }

    let start = Date()
    array = Array(repeating: true, count: array.count)
    let end = Date()
    print("Assign new array:", end.timeIntervalSince(start))
}

do {
    var array = (1...N).map { _ in arc4random_uniform(2) == 0 }

    let start = Date()
    array = array.map { _ in true }
    let end = Date()
    print("Using map():     ", end.timeIntervalSince(start))
}

do {
    var array = (1...N).map { _ in arc4random_uniform(2) == 0 }

    let start = Date()
    for i in array.indices { array[i] = true }
    let end = Date()
    print("Using for-loop:  ", end.timeIntervalSince(start))
}
Run Code Online (Sandbox Code Playgroud)

结果(在 1.2 GHz Intel Core m5 MacBook 上,以 Release 模式编译):

分配新数组:0.00120103359222412
使用 map(): 0.00364589691162109
使用 for 循环:0.000528931617736816


rma*_*ddy 5

这是另一种方法,因为您不喜欢 Martin 使用 给出的更有效的答案array = Array(repeating: true, count: array.count)

var boolArr = [true, false, false, true] // your existing array
boolArr = boolArr.map { _ in true }
Run Code Online (Sandbox Code Playgroud)

  • 只是稍微简单一点`boolArr = boolArr.map { _ in true }`。 (2认同)
  • @TeodorCiuraru 你真的应该使用马丁的答案。这比使用“map”更有效。 (2认同)