A proof of concept of a semistable vector container
# include < semistable/vector.hpp > # include < iostream > int main () { semistable::vector< int > x = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }; auto it = x. begin () + 5 ; std::cout << *it << "
" ; // prints 5 x. erase (x. begin ()); // erases first element std::cout << *it << "
" ; // prints 5 again! }
std::vector stores its contents in a contiguous block of memory, so mid insertions and erasures invalidate references and iterators to previous elements. semistable::vector is called semistable in the sense that, while references are still unstable, its iterators correctly track elements in situations like the above.
semistable::vector stores elements contiguously and provides the same API as std::vector with the extra guarantee of iterator stability (including end() ). The library is header-only and depends solely on Boost.Config. C++11 or later required.
Implementation
From the point of view of stability, there are three types of operation that cause iterators to become invalid in a classical std::vector :
insertion of elements before a given position,
erasure of elements before a given position,
... continue reading