-
Notifications
You must be signed in to change notification settings - Fork 14k
Description
Current Vec offers this method:
pub fn partition(self, f: |&T| -> bool) -> (Vec<T>, Vec<T>);That can be useful.
But sometimes you want to break up your data into more than just two groups. Maybe three; or maybe the count depends on some runtime criteria.
And also, sometimes the element itself is not the relevant predicate; sometimes the index of the element is the predicate that matters. (see e.g. #15418.)
Here's a quick sketch of a more general API:
pub fn scatter(self, num_targets: uint, g: |elem: &T, index: uint| -> uint) -> Vec<Vec<T>>;This would work by creating N vectors, where N == num_targets, and then the function g would map each (element, index) to the vector that it should be moved to. (If g ever returns a uint >= num_targets, then the method fails.)
(Another variant of this API would not provide num_targets up front; it would instead dynamically grow the set of output vectors as necessary to accommodate the values returned by g. But I think the above API would cover a lot of cases efficiently; at worst, num_targets could be made an Option<uint> to cover both use cases.)