2015-01-05 4 views
3

Я хотел бы мутировать элементы в контейнере. Единственное, о чем я забочусь, это длина контейнера и тот факт, что элементы контейнера упорядочены (т. Е. Есть первый элемент, второй элемент и т. Д.). Но я изо всех сил пытаюсь это сделать.Существует ли общий способ доступа к контейнеру с изменяемыми элементами?

Моя первая попытка была использовать Iterator изменяемых ссылок:

fn mutate<'a, A, I>(items: I) where I: Iterator<&'a mut A> 

Проблема заключается в том, что мне нужно повторять несколько раз над элементами. Но чтобы избежать сглаживания изменяемых ссылок, такие структуры, как Slice, IterMut, не реализуют Clone или RandomAccessIterator. Насколько я знаю, я не могу использовать один и тот же итератор для повторного обращения к изменяемым ссылкам более одного раза.

Итак, я посмотрел на черту IndexMut. Кажется, это то, что я хочу, но я не могу найти другую черту, указывающую длину контейнера. И структура Slice, которая реализует IndexMut, действительно проверяет каждый доступ, что нежелательно.

Так есть способ сделать то, что я хочу? Было бы неплохо использовать Iterator s, так как я действительно хочу, чтобы несколько раз перебирать изменяемые элементы.

+0

Как родовое вам это нужно быть? У вас есть образец типов, которые вам нужно поддерживать? – Shepmaster

+0

Я хотел бы поддерживать как можно больше типов, но в основном я ищу поддержку срезов и круговых буферов (RingBuf). – awelkie

ответ

1

Вы можете требовать больше оценок:

fn mutate<'a, A, I>(items: I) 
where I: Iterator<Item=&'a mut A>, 
     I: ExactSizeIterator, 
     I: RandomAccessIterator, 
     I: Clone { 
Смежные вопросы