Struct prefix_sum::PrefixSum
source · pub struct PrefixSum<T: Summable> { /* private fields */ }
Expand description
Data type allowing O(1)
interval modifications to an array.
Example
use prefix_sum::PrefixSum;
let mut sum = PrefixSum::new(6);
sum[2..=4] += 2;
sum[1..3] += 3;
sum[ ..3] -= 1;
sum[4.. ] += 10;
assert_eq!(vec![-1, 2, 4, 2, 12, 10], sum.build());
Implementations§
source§impl<T: Summable> PrefixSum<T>
impl<T: Summable> PrefixSum<T>
sourcepub fn new(len: usize) -> PrefixSum<T>
pub fn new(len: usize) -> PrefixSum<T>
Builds a new PrefixSum
filled with zeroes.
This runs in linear time in the length.
sourcepub fn from_vec(vec: Vec<T>) -> PrefixSum<T>
pub fn from_vec(vec: Vec<T>) -> PrefixSum<T>
Returns a PrefixSum
, such that calling build
on the result would return the
input.
This allocates if vec.len() == vec.capacity()
. This runs in linear time in the
length.
Examples
use prefix_sum::PrefixSum;
let sum = PrefixSum::from_vec(vec![1, 2, 3, 4]);
assert_eq!(sum.build(), vec![1, 2, 3, 4]);
When resized, new items will be zero.
use prefix_sum::PrefixSum;
let mut sum = PrefixSum::from_vec(vec![1, 2, 3, 4]);
sum.resize(5);
assert_eq!(sum.build(), vec![1, 2, 3, 4, 0]);
sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the number of items in this prefix sum.
This runs in constant time.
sourcepub fn resize(&mut self, len: usize)
pub fn resize(&mut self, len: usize)
Resize the prefix sum. Any changes done using intervals with no upper bound will affect the newly created values.
If the size is decreased, this is constant time. If the size is increased, this runs in amortized linear time in the number of items added.
Example
use prefix_sum::PrefixSum;
let mut sum = PrefixSum::new(3);
sum[ ..] += 2;
sum[1..] += 3;
sum[2] += 1;
assert_eq!(vec![2, 5, 6], sum.clone().build());
sum.resize(4);
assert_eq!(vec![2, 5, 6, 5], sum.build());
Trait Implementations§
source§impl<T: Summable> Index<Range<usize>> for PrefixSum<T>
impl<T: Summable> Index<Range<usize>> for PrefixSum<T>
§type Output = PrefixSumRange<T>
type Output = PrefixSumRange<T>
The returned type after indexing.
source§impl<T: Summable> Index<RangeFrom<usize>> for PrefixSum<T>
impl<T: Summable> Index<RangeFrom<usize>> for PrefixSum<T>
§type Output = UnboundedPrefixSumRange<T>
type Output = UnboundedPrefixSumRange<T>
The returned type after indexing.
source§impl<T: Summable> Index<RangeFull> for PrefixSum<T>
impl<T: Summable> Index<RangeFull> for PrefixSum<T>
§type Output = UnboundedPrefixSumRange<T>
type Output = UnboundedPrefixSumRange<T>
The returned type after indexing.
source§impl<T: Summable> Index<RangeInclusive<usize>> for PrefixSum<T>
impl<T: Summable> Index<RangeInclusive<usize>> for PrefixSum<T>
§type Output = PrefixSumRange<T>
type Output = PrefixSumRange<T>
The returned type after indexing.
source§fn index(&self, i: RangeInclusive<usize>) -> &PrefixSumRange<T>
fn index(&self, i: RangeInclusive<usize>) -> &PrefixSumRange<T>
Performs the indexing (
container[index]
) operation. Read moresource§impl<T: Summable> Index<RangeTo<usize>> for PrefixSum<T>
impl<T: Summable> Index<RangeTo<usize>> for PrefixSum<T>
§type Output = PrefixSumRange<T>
type Output = PrefixSumRange<T>
The returned type after indexing.
source§impl<T: Summable> Index<RangeToInclusive<usize>> for PrefixSum<T>
impl<T: Summable> Index<RangeToInclusive<usize>> for PrefixSum<T>
§type Output = PrefixSumRange<T>
type Output = PrefixSumRange<T>
The returned type after indexing.
source§fn index(&self, i: RangeToInclusive<usize>) -> &PrefixSumRange<T>
fn index(&self, i: RangeToInclusive<usize>) -> &PrefixSumRange<T>
Performs the indexing (
container[index]
) operation. Read moresource§impl<T: Summable> Index<usize> for PrefixSum<T>
impl<T: Summable> Index<usize> for PrefixSum<T>
§type Output = PrefixSumRange<T>
type Output = PrefixSumRange<T>
The returned type after indexing.
source§impl<T: Summable> IndexMut<RangeInclusive<usize>> for PrefixSum<T>
impl<T: Summable> IndexMut<RangeInclusive<usize>> for PrefixSum<T>
source§fn index_mut(&mut self, i: RangeInclusive<usize>) -> &mut PrefixSumRange<T>
fn index_mut(&mut self, i: RangeInclusive<usize>) -> &mut PrefixSumRange<T>
Performs the mutable indexing (
container[index]
) operation. Read moresource§impl<T: Summable> IndexMut<RangeToInclusive<usize>> for PrefixSum<T>
impl<T: Summable> IndexMut<RangeToInclusive<usize>> for PrefixSum<T>
source§fn index_mut(&mut self, i: RangeToInclusive<usize>) -> &mut PrefixSumRange<T>
fn index_mut(&mut self, i: RangeToInclusive<usize>) -> &mut PrefixSumRange<T>
Performs the mutable indexing (
container[index]
) operation. Read more