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

标签 arrays swift filtering immutability

可以像这样在 swift 中过滤一个数组:

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]

关于arrays - 如何通过过滤在swift中就地改变整数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37778102/

相关文章:

用于创建数组数组的 Ruby 脚本

c++ - 基于排序的分区(如快速排序)

c++ - std::array of unknown size 作为类成员

ios - UITableView 是否可以包含一些自定大​​小的单元格和自定义高度的单元格?

ios - Swift 4+实例化符合协议(protocol)的类变量

arrays - 排列一个整数数组,使得两个连续数字的和不能被 3 整除

ios - Xcode 7、iOS 9 和 Swift 2.0 让 ViewController 的生命周期变得很奇怪

Angular:具有使用 mat-select-filter 并向过滤器字段添加图标的搜索功能的多个 mat-select 下拉列表

python - 消除给定百分位数上的所有数据

javascript - 过滤列的集合