How do I get a slice of a Vec in Rust?

2020-05-20 06:58发布

问题:

I can not find within the documentation of Vec<T> how to retrieve a slice from a specified range.

Is there something like this in the standard library:

let a = vec![1, 2, 3, 4];
let suba = a.subvector(0, 2); // Contains [1, 2];

回答1:

The documentation for Vec covers this in the section titled "slicing".

You can create a slice of a Vec or array by indexing it with a Range (or RangeInclusive, RangeFrom, RangeTo, RangeToInclusive, or RangeFull), for example:

fn main() {
    let a = vec![1, 2, 3, 4, 5];

    // With a start and an end
    println!("{:?}", &a[1..4]);

    // With a start and an end, inclusive
    println!("{:?}", &a[1..=3]);

    // With just a start
    println!("{:?}", &a[2..]);

    // With just an end
    println!("{:?}", &a[..3]);

    // With just an end, inclusive
    println!("{:?}", &a[..=2]);

    // All elements
    println!("{:?}", &a[..]);
}


回答2:

If you wish to convert the entire Vec to a slice, you can use deref coercion:

fn main() {
    let a = vec![1, 2, 3, 4, 5];
    let b: &[i32] = &a;

    println!("{:?}", b);
}

This coercion is automatically applied when calling a function:

fn print_it(b: &[i32]) {
    println!("{:?}", b);
}

fn main() {
    let a = vec![1, 2, 3, 4, 5];
    print_it(&a);
}

You can also call Vec::as_slice, but it's a bit less common:

fn main() {
    let a = vec![1, 2, 3, 4, 5];
    let b = a.as_slice();
    println!("{:?}", b);
}

See also:

  • Why is it discouraged to accept a reference to a String (&String), Vec (&Vec) or Box (&Box) as a function argument?


标签: vector rust