私はCusterで使用する単純なデータ構造を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;
}
}
錆コード:
/// 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());
}
}
}