How do I get a slice of a Vec<T> in Rust?
83,767
Solution 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[..]);
}
Solution 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:
Related videos on Youtube
Comments
-
yageek almost 4 years
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];
-
Will Brickner over 4 yearsWhat's the behavior of the range with no explicit end index? Does it imply the range goes to the end of the vector (e.g. vector length)? I can't find this documented.
-
Brian Campbell over 4 yearsYes, that's right. It's explicitly documented in the docs for the
SliceIndex
impls, for example,impl SliceIndex<str> for RangeFrom<usize>
: "Returns a slice of the given string from the byte range[begin, len)
. Equivalent to&self[begin .. len]
or&mut self[begin .. len]
." -
AndreKR over 3 years+1 I like
.as_slice()
much better than[..]
because it conveys the intent. (Converting the Vec into a slice because only slices, not Vecs, implementio::Read
.)