🔖
BTreeSetで特定の値の次の値を取得する
BTreeSetに値を追加しながらループするようなケースの場合、所有権の都合でコンパイルエラーとなることがある。
これを避けるために特定の値の次の値を取得する方法を考えた。
BTreeSetのiterメソッドは昇順で走査する。
そのため、次のようにすれば特定の値の次の値を取得できる。
let set = BTreeSet::from([2, 4, 5, 8, 12]);
let mut p = set.range(5..); // 5以上のRangeを取得する
p.next(); // イテレーターを5に進める
if let Some(v) = p.next() { // イテレーターを8に進める
println!("{}", v); // 8
}
自信はないがこうもかけそうだ?
let set = BTreeSet::from([2, 4, 5, 8, 12]);
let mut p = set.range((Excluded(&5), Unbounded)); // 5より大きいRangeを取得
if let Some(v) = p.next() { // イテレーターを8に進める
println!("{}", v); // 8
}
Discussion
イテレーターの次の値を取得したいだけなら、peekというメソッドが使えます。
※peek = チラ見する、という意味です
peek()を使う事でイテレーターを進めずに、次の値を覗き見る事ができます。