🔖

BTreeSetで特定の値の次の値を取得する

に公開1

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

ODENODEN

イテレーターの次の値を取得したいだけなら、peekというメソッドが使えます。

let set = BTreeSet::from([2, 4, 5, 8, 12]);
let mut p = set.range(5..).peekable();
p.next();
if let Some(v) = p.peek() {
	println!("{}", v); // 8
}

※peek = チラ見する、という意味です
peek()を使う事でイテレーターを進めずに、次の値を覗き見る事ができます。