Skip to content

Commit cf82412

Browse files
Fix FromIterator for Segtree (#138)
* fix FromIterator for Segtree * remove unnecessary vec!
1 parent 663c8fb commit cf82412

File tree

1 file changed

+14
-16
lines changed

1 file changed

+14
-16
lines changed

src/segtree.rs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -137,22 +137,8 @@ impl<M: Monoid> From<Vec<M::S>> for Segtree<M> {
137137
}
138138
impl<M: Monoid> FromIterator<M::S> for Segtree<M> {
139139
fn from_iter<T: IntoIterator<Item = M::S>>(iter: T) -> Self {
140-
let iter = iter.into_iter();
141-
let n = iter.size_hint().0;
142-
let log = ceil_pow2(n as u32) as usize;
143-
let size = 1 << log;
144-
let mut d = Vec::with_capacity(size * 2);
145-
d.extend(
146-
std::iter::repeat_with(M::identity)
147-
.take(size)
148-
.chain(iter)
149-
.chain(std::iter::repeat_with(M::identity).take(size - n)),
150-
);
151-
let mut ret = Segtree { n, size, log, d };
152-
for i in (1..size).rev() {
153-
ret.update(i);
154-
}
155-
ret
140+
let v = iter.into_iter().collect::<Vec<_>>();
141+
v.into()
156142
}
157143
}
158144
impl<M: Monoid> Segtree<M> {
@@ -353,6 +339,18 @@ mod tests {
353339
check_segtree(&internal, &segtree);
354340
}
355341

342+
#[test]
343+
fn test_segtree_fromiter() {
344+
let v = [1, 4, 1, 4, 2, 1, 3, 5, 6];
345+
let base = v
346+
.iter()
347+
.copied()
348+
.filter(|&x| x % 2 == 0)
349+
.collect::<Vec<_>>();
350+
let segtree: Segtree<Max<_>> = v.iter().copied().filter(|&x| x % 2 == 0).collect();
351+
check_segtree(&base, &segtree);
352+
}
353+
356354
//noinspection DuplicatedCode
357355
fn check_segtree(base: &[i32], segtree: &Segtree<Max<i32>>) {
358356
let n = base.len();

0 commit comments

Comments
 (0)