9 #ifndef COMPRESSED_VECTOR_HPP
10 #define COMPRESSED_VECTOR_HPP
15 #include "flat_map.hpp"
21 std::vector<std::pair<size_t, T> > data_m;
23 size_t allocated_size_m;
26 inline const size_t lower_bound(
const size_t& index) {
30 typename std::vector<std::pair<size_t, T> >::iterator it;
32 guess = (end + start) >> 1;
33 if (data_m[guess].first < index) {
42 T value(
const size_t& index) {
44 size_t id = lower_bound(index);
45 if (
id >= size_m || data_m[
id].first != index) {
49 return data_m[id].second;
52 T& ref(
size_t index) {
53 size_t id = lower_bound(index);
54 if (
id >= size_m || data_m[
id].first != index) {
55 resize(size_m + 1, 1);
56 for (
size_t j = size_m - 1; j > id; --j) {
57 data_m[j] = data_m[j - 1];
59 data_m[id] = std::pair<size_t, T>(index, T());
61 return data_m[id].second;
64 inline void reallocate(
size_t size) {
66 allocated_size_m = size;
70 typedef typename std::vector<std::pair<size_t, T> >::iterator iterator;
71 typedef typename std::vector<std::pair<size_t, T> >::const_iterator const_iterator;
72 typedef typename std::vector<std::pair<size_t, T> >::reverse_iterator reverse_iterator;
73 typedef typename std::vector<std::pair<size_t, T> >::const_reverse_iterator const_reverse_iterator;
75 compressed_vector(
size_t size = 0) : size_m(0), allocated_size_m(0), max_held(0) {
99 inline T&
at(
size_t index) {
111 inline T
get(
size_t index) {
127 inline void clear() {
128 this->allocated_size_m = 0;
130 this->data_m.clear();
137 void reserve(
size_t size) {
138 data_m.reserve(size);
141 void resize(
size_t size,
double factor = 1) {
142 if (allocated_size_m < size) {
143 reallocate(size +
size_t(factor *
double(size)));
148 iterator find(
size_t index) {
149 size_t id = lower_bound(index);
150 if (
id >= size_m || data_m[
id].first != index) {
153 return data_m.begin() + id;
157 return data_m.begin();
160 const_iterator begin()
const {
161 return data_m.begin();
168 const_iterator end()
const {
172 reverse_iterator rbegin() {
173 return data_m.rbegin();
176 const_reverse_iterator rbegin()
const {
177 return data_m.rbegin();
180 reverse_iterator rend() {
181 return data_m.rend();
184 const_reverse_iterator rend()
const {
185 return data_m.rend();
T operator()(size_t index)
Definition: compressed_vector.hpp:123
Definition: Combinations.hpp:17
Definition: compressed_vector.hpp:20
T & operator[](size_t index)
Definition: compressed_vector.hpp:88
T & at(size_t index)
Definition: compressed_vector.hpp:99