Я пытаюсь перевести некоторые простые структуры данных, которые я использую в C++ для Rust, начиная с дерева интервалов, но я не понимаю, как изменить мою базовую структуру данных (здесь std::collections::BTreeSet
) во время итерации - по существу, я могу объединить перекрывающиеся записи по мере их появления.Изменение объекта во время итерации
Если я использую стандартную идиому для итерации по коллекции, я получаю следующее сообщение об ее неизменяемости: «не может брать self.storage
в качестве изменчивого, потому что он также заимствован как неизменный», и, похоже, нет опции чтобы получить изменчивый итератор, который я вижу ... что мне не хватает?
C++ код:
inline void Insert(const Interval& interval)
{
auto it = storage.insert(interval);
// check to see if we overlap the previous element,
// if we do, start our merge loop from there
if (it != begin()) {
const_iterator prev = std::prev(it);
if (prev->Overlaps(*it)) it = prev;
}
while (it != end()) {
const_iterator nx = std::next(it);
if (nx != end() && it->Overlaps(*nx)) {
const Interval u = it->Union(*nx);
it = storage.erase(it);
it = storage.erase(it);
it = storage.insert(it, u);
} else
break;
}
}
код Rust:
/// Add a new interval into the tree
pub fn insert(&mut self, other: Interval) ->() {
self.storage.insert(other);
for int in self.storage.iter() {
if other <= *int {
break
} else if other.overlaps(int) {
self.storage.remove(&other);
self.storage.remove(int);
self.storage.insert(other.union(int).unwrap());
}
}
}