Skip to content

Vec partition could be generalized to a scatter operation #15437

Closed
@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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions