数组-如何通过过滤快速就地改变整数数组

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

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

是否可以过滤并避免在过滤完成后发生的复制操作,例如,对原始数组进行突变.

以类似于此伪代码的方式:
    number.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());
最佳答案
任何数组都是一个值类型的结构.它不能被突变,只能被复制或替换.

Structures and Enumerations Are Value Types

如果要使用引用类型,则必须使用一个类来实现自己的可变类型的数组-或使用Foundation的NSMutableArray.

如果您想简化代码,以便可以将其作为变异函数来调用,则可以使用扩展名:

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"

转载注明原文:数组-如何通过过滤快速就地改变整数数组 - 代码日志