繁体   English   中英

如何通过过滤在 swift 中就地改变整数数组

[英]How to mutate an array of integers in-place in swift through filtering

可以快速过滤这样的数组:

var numbers = Array(1...1000000)
numbers = numbers.filter( { return $0 % 2 == 0  } ) 

是否可以过滤并避免在过滤完成时发生的复制操作,例如改变原始数组。

与此伪代码类似: numbers.MutablefilterOperation({ return $0 % 2 == 0})

在 C++ 中,相当于上面 Swift 中发生的事情是:

std::vector<int> originalNumbers(1000000);
std::vector<int> newNumbers;
std::copy_if (originalNumbers.begin(), originalNumbers.end(), std::back_inserter(newNumbers), [](int i) { return i % 2 == 0 } );

出于性能原因,我想实现的目标:

std::vector<int> originalNumbers(1000000);
auto pos = std::remove_if(originalNumbers.begin(), originalNumbers.end(), [](int x) { return x % 2 == 0; });
originalNumbers.erase(pos, originalNumbers.end());

此实现应该进行过滤,而不必在进程中制作整个数组的临时副本(除非它的副本被另一个变量引用,请参阅“写入时复制”)

extension Array {
    mutating func filterInPlace(isIncluded: (Element) throws -> Bool) rethrows {
        var writeIndex = self.startIndex
        for readIndex in self.indices {
            let element = self[readIndex]
            let include = try isIncluded(element)
            if include {
                if writeIndex != readIndex {
                    self[writeIndex] = element
                }
                writeIndex = self.index(after: writeIndex)
            }
        }
        self.removeLast(self.distance(from: writeIndex, to: self.endIndex))
    }
}

// example:
var arr = [6,2,6,5,2,5,6,2,2,1,6,7,3]
arr.filterInPlace { $0 % 2 == 1 }
print(arr) // [5, 5, 1, 7, 3]

任何Array都是一个值类型的struct 它不能变异,只能复制或替换。

结构和枚举是值类型

如果你想要一个引用类型,你将不得不使用一个class来实现你自己的可变类型的数组 - 或者使用Foundation的NSMutableArray

如果您想简化代码以便将其称为变异函数,则可以使用extension

extension Array {
  // the mutating function should be named "filter" but 
  // this is already taken by the non-mutating function
  mutating func filtering(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element] {
    try self = self.filter(isIncluded)
    return self
  }
}

var numbers = Array(1...10)
numbers.filtering( { return $0 % 2 == 0  } )
print(numbers) // "[2, 4, 6, 8, 10]\n"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM