Трейт DoubleEndedIterator
Трейт DoubleEndedIterator расширяет возможности обычного
итератора Iterator, добавляя возможность получать
элементы не только с начала, но и с конца коллекции. Главным
методом этого трейта является next_back, который
возвращает следующий элемент с конца итератора. Благодаря
этому трейту становятся доступны такие методы, как
rev, rposition, last и другие. Трейт
реализован для большинства стандартных коллекций: векторов,
срезов, диапазонов, строк и многих адаптеров итераторов.
Важно понимать, что итератор можно перебирать с обоих концов
только до тех пор, пока они не встретятся.
Синтаксис
trait DoubleEndedIterator: Iterator
{
fn next_back(&mut self) -> Option<Self::Item>;
}
Пример
Давайте получим элементы с конца вектора при помощи метода
next_back:
fn main()
{
let mut iter = vec![1, 2, 3, 4, 5].into_iter();
println!("{:?}", iter.next_back());
println!("{:?}", iter.next_back());
println!("{:?}", iter.next());
}
Результат выполнения кода:
Some(5)
Some(4)
Some(1)
Пример
Давайте перевернём вектор при помощи метода rev,
который доступен только для двусторонних итераторов:
fn main()
{
let res: Vec<i32> = vec![1, 2, 3, 4, 5]
.into_iter()
.rev()
.collect();
println!("{:?}", res);
}
Результат выполнения кода:
[5, 4, 3, 2, 1]
Пример
Давайте найдём позицию элемента с конца при помощи метода
rposition:
fn main()
{
let res = vec!["a", "b", "c", "d", "e"]
.into_iter()
.rposition(|x| x == "c");
println!("{:?}", res);
}
Результат выполнения кода:
Some(2)