Skip to content

Vec partition could be generalized to a scatter operation #15437

@pnkfelix

Description

@pnkfelix

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.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions