A sparse vector. More...
#include <sparse_vector.h>
Classes | |
class | const_datarange_t |
A constant reference to a data range. More... | |
class | const_iterator |
Iterator to the sparse vector values. More... | |
class | const_reference |
Special little box to allow void elements to be treated as references. More... | |
class | datarange_t |
Range class, with range and data. More... | |
class | iterator |
Iterator to the sparse vector values. More... | |
class | reference |
A class representing a cell in a sparse vector. More... | |
Public Types | |
typedef T | value_type |
type of the stored values More... | |
typedef std::vector< value_type > | vector_t |
type of STL vector holding this data More... | |
typedef vector_t::size_type | size_type |
size type More... | |
typedef vector_t::difference_type | difference_type |
index difference type More... | |
typedef vector_t::pointer | pointer |
typedef vector_t::const_pointer | const_pointer |
typedef std::vector< datarange_t > | range_list_t |
type of sparse vector data More... | |
typedef range_list_t::iterator | range_iterator |
type of iterator over ranges More... | |
typedef range_list_t::const_iterator | range_const_iterator |
type of constant iterator over ranges More... | |
Public Member Functions | |
sparse_vector () | |
Default constructor: an empty vector. More... | |
sparse_vector (size_type new_size) | |
Constructor: a vector with new_size elements in the void. More... | |
sparse_vector (const vector_t &from, size_type offset=0) | |
Constructor: a solid vector from an existing STL vector. More... | |
sparse_vector (sparse_vector const &)=default | |
Copy constructor: default. More... | |
sparse_vector (sparse_vector &&from) | |
Move constructor. More... | |
sparse_vector & | operator= (sparse_vector const &)=default |
Copy assignment: default. More... | |
sparse_vector & | operator= (sparse_vector &&from) |
Move assignment. More... | |
sparse_vector (vector_t &&from, size_type offset=0) | |
Constructor: a solid vector from an existing STL vector. More... | |
~sparse_vector ()=default | |
Destructor: default. More... | |
void | clear () |
Removes all the data, making the vector empty. More... | |
size_type | size () const |
Returns the size of the vector. More... | |
bool | empty () const |
Returns whether the vector is empty. More... | |
size_type | capacity () const |
Returns the capacity of the vector (compatibility only) More... | |
value_type | operator[] (size_type index) const |
Access to an element (read only) More... | |
reference | operator[] (size_type index) |
Access to an element (read/write for non-void elements only!) More... | |
auto | range_const_data (std::size_t i) const |
Like range_data() but with explicitly read-only access to data. More... | |
range_const_iterator | begin_range () const |
Returns a constant iterator to the first data range. More... | |
range_const_iterator | end_range () const |
Returns a constant iterator to after the last data range. More... | |
std::size_t | find_range_number (size_type index) const |
Returns the number (0-based) of range containing index . More... | |
datarange_t | make_void_around (size_type index) |
Casts the whole range with the specified item into the void. More... | |
bool | is_valid () const |
Returns if the vector is in a valid state. More... | |
void | make_void (iterator first, iterator last) |
Makes all the elements from first and before last void. More... | |
template<typename ITER > | |
const lar::sparse_vector< T > ::datarange_t & | add_range (size_type offset, ITER first, ITER last) |
template<typename ITER , typename OP > | |
auto | combine_range (size_type offset, ITER first, ITER last, OP &&op, value_type void_value) -> const datarange_t & |
void | resize (size_type new_size) |
Resizes the vector to the specified size, adding void. More... | |
void | resize (size_type new_size, value_type def_value) |
Resizes the vector to the specified size, adding def_value. More... | |
iterator | begin () |
Standard iterators interface. More... | |
iterator | end () |
const_iterator | begin () const |
const_iterator | end () const |
const_iterator | cbegin () const |
const_iterator | cend () const |
Cell test | |
The methods in this group test the single vector cells. | |
bool | is_void (size_type index) const |
Returns whether the specified position is void. More... | |
bool | back_is_void () const |
Returns whether the sparse vector ends with void. More... | |
size_type | count () const |
Returns the number of non-void cells. More... | |
Cell set | |
The methods in this group access and/or change the cell values. | |
value_type & | set_at (size_type index, value_type value) |
Writes into an element (creating or expanding a range if needed) More... | |
void | unset_at (size_type index) |
Casts the element with the specified index into the void. More... | |
void | push_back (value_type value) |
void | push_back (value_type value, value_type thr) |
Adds one element to the end of the vector (if zero, just adds void) More... | |
template<typename ITER > | |
void | assign (ITER first, ITER last) |
Copies data from a sequence between two iterators. More... | |
template<typename CONT > | |
void | assign (const CONT &new_data) |
Copies data from a container. More... | |
void | assign (vector_t &&new_data) |
Moves data from a vector. More... | |
Ranges | |
A range is a contiguous region of the sparse vector which contains all non-void values. A sparse vector is effectively a sorted collection of ranges. This interface allows:
| |
const range_list_t & | get_ranges () const |
Returns the internal list of non-void ranges. More... | |
auto | iterate_ranges () -> decltype(auto) |
size_type | n_ranges () const |
Returns the internal list of non-void ranges. More... | |
const datarange_t & | range (size_t i) const |
Returns the i-th non-void range (zero-based) More... | |
auto | range_data (std::size_t i) |
Provides direct access to data of i-th non-void range (zero-based) More... | |
auto | range_data (std::size_t const i) const |
range_const_iterator | find_range_iterator (size_type index) const |
Returns an iterator to the range containing the specified index. More... | |
range_iterator | find_range_iterator (size_type index) |
const datarange_t & | find_range (size_type index) const |
Returns the range containing the specified index. More... | |
datarange_t & | find_range (size_type index) |
template<typename ITER > | |
const datarange_t & | add_range (size_type offset, ITER first, ITER last) |
Adds a sequence of elements as a range with specified offset. More... | |
template<typename CONT > | |
const datarange_t & | add_range (size_type offset, const CONT &new_data) |
Copies the elements in container to a range with specified offset. More... | |
const datarange_t & | add_range (size_type offset, vector_t &&new_data) |
Adds a sequence of elements as a range with specified offset. More... | |
template<typename ITER , typename OP > | |
const datarange_t & | combine_range (size_type offset, ITER first, ITER last, OP &&op, value_type void_value=value_zero) |
Combines a sequence of elements as a range with data at offset . More... | |
template<typename CONT , typename OP > | |
const datarange_t & | combine_range (size_type offset, const CONT &other, OP &&op, value_type void_value=value_zero) |
Combines the elements in container with the data at offset . More... | |
template<typename ITER > | |
const datarange_t & | append (ITER first, ITER last) |
Adds a sequence of elements as a range at the end of the vector. More... | |
template<typename CONT > | |
const datarange_t & | append (const CONT &range_data) |
Adds a sequence of elements as a range at the end of the vector. More... | |
const datarange_t & | append (vector_t &&range_data) |
Adds a sequence of elements as a range at the end of the vector. More... | |
datarange_t | void_range (range_iterator const iRange) |
Turns the specified range into void. More... | |
datarange_t | void_range (std::size_t const iRange) |
bool | optimize () |
Performs internal optimization, returns whether the object was changed. More... | |
bool | optimize (size_t) |
Static Public Member Functions | |
Static members related to data size and optimization | |
static size_t | expected_vector_size (size_t size) |
Returns the expected size taken by a vector of specified size. More... | |
static size_t | min_gap () |
Minimum optimal gap between ranges (a guess) More... | |
static bool | should_merge (const typename datarange_t::base_t &a, const typename datarange_t::base_t &b) |
Returns if merging the two specified ranges would save memory. More... | |
Protected Member Functions | |
size_type | minimum_size () const |
Returns the size determined by the ranges already present. More... | |
const datarange_t & | add_range_before (size_type offset, vector_t &&new_data, range_iterator nextRange) |
Implementation detail of add_range() , with where to add the range. More... | |
range_iterator | eat_range_head (range_iterator iRange, size_t index) |
Voids the starting elements up to index (excluded) of a given range. More... | |
datarange_t & | merge_ranges (range_iterator iRange) |
Merges all the following contiguous ranges. More... | |
size_type | fix_size () |
Extends the vector size according to the last range. More... | |
range_iterator | find_next_range_iter (size_type index) |
Returns an iterator to the range after index . More... | |
range_const_iterator | find_next_range_iter (size_type index) const |
range_iterator | find_next_range_iter (size_type index, range_iterator rbegin) |
Returns an iterator to the range after index , or ranges.end() if none. More... | |
range_const_iterator | find_next_range_iter (size_type index, range_const_iterator rbegin) const |
range_iterator | find_range_iter_at_or_after (size_type index) |
Returns an iterator to the range at or after index . More... | |
range_const_iterator | find_range_iter_at_or_after (size_type index) const |
range_iterator | find_extending_range_iter (size_type index) |
Returns an iterator to the range no earlier than index , or end() if none. More... | |
range_const_iterator | find_extending_range_iter (size_type index) const |
range_iterator | find_extending_range_iter (size_type index, range_iterator rbegin) |
Returns an iterator to the range that contains the first non-void element after index , or end() if none. More... | |
range_const_iterator | find_extending_range_iter (size_type index, range_const_iterator rbegin) const |
range_iterator | insert_range (range_iterator iInsert, const datarange_t &data) |
Plug a new data range in the specified position; no check performed. More... | |
range_iterator | insert_range (range_iterator iInsert, datarange_t &&data) |
Protected Attributes | |
size_type | nominal_size |
current size More... | |
range_list_t | ranges |
list of ranges More... | |
Private Types | |
typedef sparse_vector< T > | this_t |
Static members for dealing with this type of value | |
static constexpr value_type | value_zero {0} |
a representation of 0 More... | |
static value_type | abs (value_type v) |
Returns the module of the specified value. More... | |
static value_type | is_zero (value_type v) |
Returns whether the value is exactly zero. More... | |
static value_type | is_zero (value_type v, value_type thr) |
Returns whether the value is zero below a given threshold. More... | |
static value_type | is_equal (value_type a, value_type b) |
Returns whether two values are the same. More... | |
static value_type | is_equal (value_type a, value_type b, value_type thr) |
Returns whether two values are the same below a given threshold. More... | |
A sparse vector.
T | type of data stored in the vector |
A sparse_vector is a container of items marked by consecutive indices (that is, a vector like std::vector), where only non-zero elements are actually stored. The implementation is a container of ranges of non-zero consecutive values; the zero elements are effectively not stored in the object, and a zero is returned whenever they are accessed. In the following, the regions of zeros between the non-zero ranges are collectively called "the void".
See sparse_vector_test.cc for examples of usage.
Although some level of dynamic assignment is present, the class is not very flexible and it is best assigned just once, by adding ranges (add_range(); or by push_back(), which is less efficient). While this class mimics a good deal of the STL vector interface, it is not a std::vector and it does not support all the tricks of it.
For the following, let's assume:
Common iteration on all elements. Better to do a constant one. The first two examples print the full content of the sparse vector, void included.
Assign to an existing (not void) element. Assigning to void elements is not supported, and there is no way to make an existing element to become void (assigning 0 will yield to an existing element with value 0).
Assign a value to an element. The element could be in the void; in any case, after this call the element will not be in the void anymore (even if the assigned value is zero; to cast a cell into the void, use unset_at()).
Add the content of buffer starting at the specified position. The last line will attempt to use the buffer directly (only happens if the start of the new range – 20 in the example – is in the void and therefore a new range will be added). The new range is merged with the existing ones when needed, and it overwrites their content in case of overlap. If the specified position is beyond the current end of the sparse vector, the gap will be filled by void.
Add the content of buffer at the end of the sparse vector. The last line will attempt to use the buffer directly (only happens if the end of the sparse vector is in the void and therefore a new range will be added).
Resizes the sparse vector to the specified size. Truncation may occur, in which case the data beyond the new size is removed. If an extension occurs instead, the new area is void.
A sparse vector can be parsed range by range, skipping the void. Each range object itself supports iteration. Neither the content nor the shape of the ranges can be changed this way.
is not supported if the vector is shorter than 11 (similarly to a std::vector too), and not even if the item #10 is currently in the void. This latter could be changed to create a new element/range; this would require to ship the pointer to the container with the reference (the return value of "sv[10]"), just in case an assignment will occur, or to create the element regardless, like for std::map (but this would provoke a disaster if the caller uses the non-constant operator[] for iteration). So far, set_at() is the closest thing to it.
This has no clear meaning. A usage analogous to STL would precede a sequence of push_back's. In that case, we should create a new empty range at the end of the vector, and reserve that. Empty ranges are currently not allowed. A replacement of this pattern is to create a new std::vector
, reserve space for it and fill it, and finally use sparse_vector::append()
. If the end of the vector is void, there will be no performance penalty, otherwise a reserve + copy will happen.
In order to allow for assignment in an item which is currently not void, the non-constant iterators do not dereference directly into a reference to the vector element (which would be non-existent if in the void), but instead into a lightweight object (still called "reference"). These objects are semantically working as references, but they are formally rvalues (i.e., just values, not C++ references), so they can't be assigned to references (like "auto&"). Nevertheless they work as references and assigning to them does change the original value. Currently assigning to void cells is not supported (see above).
Definition at line 289 of file sparse_vector.h.
typedef vector_t::const_pointer lar::sparse_vector< T >::const_pointer |
Definition at line 480 of file sparse_vector.h.
typedef vector_t::difference_type lar::sparse_vector< T >::difference_type |
index difference type
Definition at line 477 of file sparse_vector.h.
typedef vector_t::pointer lar::sparse_vector< T >::pointer |
Definition at line 479 of file sparse_vector.h.
typedef range_list_t::const_iterator lar::sparse_vector< T >::range_const_iterator |
type of constant iterator over ranges
Definition at line 498 of file sparse_vector.h.
typedef range_list_t::iterator lar::sparse_vector< T >::range_iterator |
type of iterator over ranges
Definition at line 496 of file sparse_vector.h.
typedef std::vector<datarange_t> lar::sparse_vector< T >::range_list_t |
type of sparse vector data
Definition at line 491 of file sparse_vector.h.
typedef vector_t::size_type lar::sparse_vector< T >::size_type |
size type
Definition at line 476 of file sparse_vector.h.
|
private |
Definition at line 468 of file sparse_vector.h.
typedef T lar::sparse_vector< T >::value_type |
type of the stored values
Definition at line 473 of file sparse_vector.h.
typedef std::vector<value_type> lar::sparse_vector< T >::vector_t |
type of STL vector holding this data
Definition at line 474 of file sparse_vector.h.
|
inline |
|
inline |
Constructor: a vector with new_size elements in the void.
Definition at line 509 of file sparse_vector.h.
|
inline |
Constructor: a solid vector from an existing STL vector.
from | vector to copy data from |
offset | (default: 0) index the data starts from (preceeded by void) |
Definition at line 517 of file sparse_vector.h.
|
default |
Copy constructor: default.
|
inline |
|
inline |
Constructor: a solid vector from an existing STL vector.
from | vector to move data from |
offset | (default: 0) index the data starts from (preceeded by void) |
Definition at line 547 of file sparse_vector.h.
|
default |
Destructor: default.
|
inlinestatic |
Returns the module of the specified value.
Definition at line 1010 of file sparse_vector.h.
const datarange_t& lar::sparse_vector< T >::add_range | ( | size_type | offset, |
ITER | first, | ||
ITER | last | ||
) |
Adds a sequence of elements as a range with specified offset.
ITER | type of iterator |
offset | where to add the elements |
first | iterator to the first element to be added |
last | iterator after the last element to be added |
If the offset is beyond the current end of the sparse vector, void is added before the new range.
Existing ranges can be merged with the new data if they overlap.
|
inline |
Copies the elements in container to a range with specified offset.
CONT | type of container supporting the standard begin/end interface |
offset | where to add the elements |
new_data | container holding the data to be copied |
If the offset is beyond the current end of the sparse vector, void is added before the new range.
Existing ranges can be merged with the new data if they overlap.
Definition at line 837 of file sparse_vector.h.
const lar::sparse_vector< T >::datarange_t & lar::sparse_vector< T >::add_range | ( | size_type | offset, |
vector_t && | new_data | ||
) |
Adds a sequence of elements as a range with specified offset.
offset | where to add the elements |
new_data | container holding the data to be moved |
If the offset is beyond the current end of the sparse vector, void is added before the new range.
Existing ranges can be merged with the new data if they overlap. If no merging happens, new_data vector is directly used as the new range added; otherwise, it is just copied.
Definition at line 1967 of file sparse_vector.h.
const lar::sparse_vector<T>::datarange_t& lar::sparse_vector< T >::add_range | ( | size_type | offset, |
ITER | first, | ||
ITER | last | ||
) |
Definition at line 1946 of file sparse_vector.h.
|
protected |
Implementation detail of add_range()
, with where to add the range.
Definition at line 2224 of file sparse_vector.h.
|
inline |
Adds a sequence of elements as a range at the end of the vector.
first | iterator to the first element to be added |
last | iterator after the last element to be added |
The input range is copied at the end of the sparse vector. If the end of the sparse vector was the end of a range, that range is expanded, otherwise a new one is created.
Definition at line 927 of file sparse_vector.h.
|
inline |
Adds a sequence of elements as a range at the end of the vector.
range_data | contained holding the data to be copied or moved |
The input data is copied at the end of the sparse vector. If the end of the sparse vector was the end of a range, that range is expanded, otherwise a new one is created.
Definition at line 940 of file sparse_vector.h.
|
inline |
Adds a sequence of elements as a range at the end of the vector.
range_data | contained holding the data to be copied or moved |
If there is a range at the end of the sparse vector, it will be expanded with the new data. Otherwise, this method will use the data vector directly as a new range added at the end of the sparse vector.
Definition at line 953 of file sparse_vector.h.
|
inline |
Copies data from a sequence between two iterators.
ITER | type of iterator |
first | iterator pointing to the first element to be copied |
last | iterator pointing after the last element to be copied |
The previous content of the sparse vector is lost.
Definition at line 669 of file sparse_vector.h.
|
inline |
Copies data from a container.
CONT | type of container supporting the standard begin/end interface |
new_data | container with the data to be copied |
The previous content of the sparse vector is lost.
Definition at line 679 of file sparse_vector.h.
|
inline |
Moves data from a vector.
new_data | vector with the data to be moved |
The previous content of the sparse vector is lost.
Definition at line 687 of file sparse_vector.h.
|
inline |
Returns whether the sparse vector ends with void.
Definition at line 612 of file sparse_vector.h.
|
inline |
|
inline |
Definition at line 1760 of file sparse_vector.h.
|
inline |
Returns a constant iterator to the first data range.
Definition at line 757 of file sparse_vector.h.
|
inline |
Returns the capacity of the vector (compatibility only)
Definition at line 568 of file sparse_vector.h.
|
inline |
Definition at line 583 of file sparse_vector.h.
|
inline |
Definition at line 584 of file sparse_vector.h.
|
inline |
const datarange_t& lar::sparse_vector< T >::combine_range | ( | size_type | offset, |
ITER | first, | ||
ITER | last, | ||
OP && | op, | ||
value_type | void_value = value_zero |
||
) |
Combines a sequence of elements as a range with data at offset
.
ITER | type of iterator |
OP | combination operation |
offset | where to add the elements |
first | iterator to the first element to be added |
last | iterator after the last element to be added |
op | operation to be executed element by element |
void_value | (default: value_zero ) the value to use for void cells |
This is a more generic version of add_range()
, where instead of replacing the target data with the data in [ first
, last
[, the existing data is combined with the one in that interval. The operation op
is a binary operation with signature equivalent to Data_t op(Data_t, Data_t)
, and the operation is equivalent to v[i + offset] = op(v[i + offset], *(first + offset))
: op
is a binary operation whose first operand is the existing value and the second one is the one being provided. If the cell i + offset
is currently void, it will be created and the value used in the combination will be void_value
.
If the offset is beyond the current end of the sparse vector, void is added before the new range.
Existing ranges can be merged with the new data if they overlap.
|
inline |
Combines the elements in container with the data at offset
.
CONT | type of container supporting the standard begin/end interface |
OP | combination operation |
offset | where to add the elements |
other | container holding the data to be combined |
op | operation to be executed element by element |
void_value | (default: value_zero ) the value to use for void cells |
combine_range()
This is equivalent to combine_range(size_type, ITER, ITER, OP, Data_t)
using as the new data range the full content of other
container.
Definition at line 905 of file sparse_vector.h.
auto lar::sparse_vector< T >::combine_range | ( | size_type | offset, |
ITER | first, | ||
ITER | last, | ||
OP && | op, | ||
value_type | void_value | ||
) | -> const datarange_t& |
Definition at line 1982 of file sparse_vector.h.
|
inline |
Returns the number of non-void cells.
Definition at line 1818 of file sparse_vector.h.
|
protected |
Voids the starting elements up to index (excluded) of a given range.
Definition at line 2268 of file sparse_vector.h.
|
inline |
Returns whether the vector is empty.
Definition at line 565 of file sparse_vector.h.
|
inline |
Definition at line 1755 of file sparse_vector.h.
|
inline |
Definition at line 1765 of file sparse_vector.h.
|
inline |
Returns a constant iterator to after the last data range.
Definition at line 760 of file sparse_vector.h.
|
inlinestatic |
Returns the expected size taken by a vector of specified size.
Definition at line 2288 of file sparse_vector.h.
|
inlineprotected |
Returns an iterator to the range no earlier than index
, or end()
if none.
index | the absolute index |
The returned iterator points to a range that "borders" the specified index, meaning that the cell at index
is either within the range, or it is the one immediately after that range. If index
is in the middle of the void, though (i.e. if the previous cell is void), the next range is returned instead. Finally, if there is no next range, end_range()
is returned.
The result may be also interpreted as follow: if the start of the returned range is lower than index
, then the cell at index
belongs to that range. Otherwise, it initiates its own range (but that range might end up being contiguous to the next(.
Definition at line 1111 of file sparse_vector.h.
|
inlineprotected |
Definition at line 1113 of file sparse_vector.h.
|
protected |
Returns an iterator to the range that contains the first non-void element after index
, or end()
if none.
index | the absolute index |
rbegin | consider only from this range on |
ranges.end()
if noneNote that the returned range can contain index
as well.
Definition at line 2199 of file sparse_vector.h.
|
protected |
Definition at line 2212 of file sparse_vector.h.
|
inlineprotected |
Returns an iterator to the range after index
.
index | the absolute index |
Definition at line 1056 of file sparse_vector.h.
|
inlineprotected |
Definition at line 1058 of file sparse_vector.h.
|
protected |
Returns an iterator to the range after index
, or ranges.end()
if none.
index | the absolute index |
rbegin | consider only from this range on |
ranges.end()
if none Definition at line 2150 of file sparse_vector.h.
|
protected |
Definition at line 2162 of file sparse_vector.h.
const lar::sparse_vector< T >::datarange_t & lar::sparse_vector< T >::find_range | ( | size_type | index | ) | const |
Returns the range containing the specified index.
index | absolute index of the element to be sought |
std::out_of_range | if index is in no range (how appropriate!) |
Definition at line 1910 of file sparse_vector.h.
|
inline |
Definition at line 1922 of file sparse_vector.h.
|
protected |
Returns an iterator to the range at or after index
.
index | the absolute index |
find_next_range_iter()
If index
is in a range, an iterator to that range is returned. If index
is in the void, an iterator to the next range after index
is returned. If there is no such range after index
, ranges.end()
is returned.
Definition at line 2186 of file sparse_vector.h.
|
protected |
Definition at line 2174 of file sparse_vector.h.
lar::sparse_vector< T >::range_const_iterator lar::sparse_vector< T >::find_range_iterator | ( | size_type | index | ) | const |
Returns an iterator to the range containing the specified index.
index | absolute index of the element to be sought |
std::out_of_range | if index is not in the vector |
Definition at line 1897 of file sparse_vector.h.
|
inline |
Definition at line 772 of file sparse_vector.h.
|
inline |
Returns the number (0-based) of range containing index
.
index | absolute index of the element to be sought |
n_ranges()
if in void std::out_of_range | if index is not in the vector |
Definition at line 783 of file sparse_vector.h.
|
protected |
Extends the vector size according to the last range.
Definition at line 2278 of file sparse_vector.h.
|
inline |
|
inlineprotected |
Plug a new data range in the specified position; no check performed.
Definition at line 1140 of file sparse_vector.h.
|
inlineprotected |
Definition at line 1142 of file sparse_vector.h.
|
inlinestatic |
Returns whether two values are the same.
Definition at line 1020 of file sparse_vector.h.
|
inlinestatic |
Returns whether two values are the same below a given threshold.
Definition at line 1024 of file sparse_vector.h.
bool lar::sparse_vector< T >::is_valid | ( | ) | const |
Returns if the vector is in a valid state.
The vector is in a valid state if:
Definition at line 2126 of file sparse_vector.h.
bool lar::sparse_vector< T >::is_void | ( | size_type | index | ) | const |
Returns whether the specified position is void.
index | position of the cell to be tested |
out_of_range | if index is not in the vector |
Definition at line 1807 of file sparse_vector.h.
|
inlinestatic |
Returns whether the value is exactly zero.
Definition at line 1013 of file sparse_vector.h.
|
inlinestatic |
Returns whether the value is zero below a given threshold.
Definition at line 1016 of file sparse_vector.h.
auto lar::sparse_vector< T >::iterate_ranges | ( | ) | -> decltype(auto) |
void lar::sparse_vector< T >::make_void | ( | iterator | first, |
iterator | last | ||
) |
Makes all the elements from first and before last void.
Definition at line 2069 of file sparse_vector.h.
auto lar::sparse_vector< T >::make_void_around | ( | size_type | index | ) |
Casts the whole range with the specified item into the void.
index | absolute index of the element whose range is cast to void |
std::out_of_range | if index is not in the vector |
Definition at line 1930 of file sparse_vector.h.
|
protected |
Merges all the following contiguous ranges.
iRange | iterator to the range to merge the following ones into |
Starting from the range next to iRange
, if that range is contiguous to iRange
the two are merged. The merging continues while there are ranges contiguous to iRange
. In the end, an iterator is returned pointing to a range that has the same starting point that iRange
had, and that is not followed by a contiuguous range, since all contiguous ranges have been merged into it.
Definition at line 2248 of file sparse_vector.h.
|
inlinestatic |
|
inlineprotected |
Returns the size determined by the ranges already present.
Definition at line 1135 of file sparse_vector.h.
|
inline |
|
default |
Copy assignment: default.
|
inline |
lar::sparse_vector< T >::value_type lar::sparse_vector< T >::operator[] | ( | size_type | index | ) | const |
Access to an element (read only)
Definition at line 1770 of file sparse_vector.h.
lar::sparse_vector< T >::reference lar::sparse_vector< T >::operator[] | ( | size_type | index | ) |
Access to an element (read/write for non-void elements only!)
Definition at line 1789 of file sparse_vector.h.
|
inline |
Performs internal optimization, returns whether the object was changed.
Definition at line 1000 of file sparse_vector.h.
|
inline |
Definition at line 1001 of file sparse_vector.h.
|
inline |
Adds one element to the end of the vector (zero values too)
value | value to be added |
Definition at line 642 of file sparse_vector.h.
|
inline |
Adds one element to the end of the vector (if zero, just adds void)
value | value to be added |
thr | threshold below which the value is considered zero |
If the threshold is strictly negative, all values are pushed back
Definition at line 651 of file sparse_vector.h.
|
inline |
auto lar::sparse_vector< T >::range_const_data | ( | std::size_t | i | ) | const |
Like range_data()
but with explicitly read-only access to data.
Definition at line 1891 of file sparse_vector.h.
auto lar::sparse_vector< T >::range_data | ( | std::size_t | i | ) |
Provides direct access to data of i-th non-void range (zero-based)
i | index of the range |
No information about the positioning of the range itself is provided, which can be obtained with other means (e.g. range(i).begin_index()
). The returned object can be used in a ranged-for loop:
(with sv
a lar::sparse_vector
instance).
While this is a somehow clumsier interface than get_ranges()
, it allows, using the non-const
version, write access to the data elements. It intentionally provides no write access to the location of each range, though.
Definition at line 1887 of file sparse_vector.h.
|
inline |
Definition at line 750 of file sparse_vector.h.
void lar::sparse_vector< T >::resize | ( | size_type | new_size | ) |
Resizes the vector to the specified size, adding void.
Definition at line 1710 of file sparse_vector.h.
void lar::sparse_vector< T >::resize | ( | size_type | new_size, |
value_type | def_value | ||
) |
Resizes the vector to the specified size, adding def_value.
Definition at line 1733 of file sparse_vector.h.
lar::sparse_vector< T >::value_type & lar::sparse_vector< T >::set_at | ( | size_type | index, |
value_type | value | ||
) |
Writes into an element (creating or expanding a range if needed)
index | the index of the element to set |
value | the value to be set |
Note that setting the value to zero will not cast the element into void. Use unset_at for that.
Definition at line 1829 of file sparse_vector.h.
|
inlinestatic |
Returns if merging the two specified ranges would save memory.
Definition at line 2308 of file sparse_vector.h.
|
inline |
void lar::sparse_vector< T >::unset_at | ( | size_type | index | ) |
Casts the element with the specified index into the void.
Definition at line 1850 of file sparse_vector.h.
auto lar::sparse_vector< T >::void_range | ( | range_iterator const | iRange | ) |
Turns the specified range into void.
iRange | iterator or index of range to be deleted |
The range is effectively removed from the sparse vector, rendering void the interval it previously covered. The range object itself is returned (no copy is performed).
The specified range must be valid. Trying to void an invalid range (including end_range()
) yields undefined behavior.
Definition at line 2118 of file sparse_vector.h.
|
inline |
Definition at line 973 of file sparse_vector.h.
|
protected |
current size
Definition at line 1046 of file sparse_vector.h.
|
protected |
list of ranges
Definition at line 1047 of file sparse_vector.h.
|
static |
a representation of 0
Definition at line 1007 of file sparse_vector.h.