26 typedef V mapped_type;
27 typedef std::pair<const K, V> value_type;
28 typedef COMP key_compare;
29 typedef ALLOC allocator_type;
30 typedef value_type &reference;
31 typedef const value_type &const_reference;
34 typedef std::list<value_type, ALLOC> list_type;
35 typedef typename list_type::iterator list_iterator;
39 typedef typename list_type::iterator iterator;
40 typedef typename list_type::const_iterator const_iterator;
41 typedef std::reverse_iterator<iterator> reverse_iterator;
42 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
45 friend class ordered_map;
49 explicit value_compare(COMP c) : comp(c) {}
52 bool operator()(
const value_type &a,
const value_type &b)
const {
53 return comp(a.first, b.first);
60 bool operator()(
const K *a,
const K *b)
const {
return comp(*a, *b); }
62 using map_alloc =
typename std::allocator_traits<ALLOC>::template rebind_alloc<
63 std::pair<const K *const, list_iterator>>;
64 using map_type = std::map<const K *, list_iterator, mapcmp, map_alloc>;
66 void init_data_map() {
68 for (
auto it = data.begin(); it != data.end(); it++) data_map.emplace(&it->first, it);
70 iterator tr_iter(
typename map_type::iterator i) {
71 if (i == data_map.end())
return data.end();
74 const_iterator tr_iter(
typename map_type::const_iterator i)
const {
75 if (i == data_map.end())
return data.end();
80 typedef typename map_type::size_type size_type;
83 ordered_map(
const ordered_map &a) : data(a.data) { init_data_map(); }
84 template <
typename InputIt>
85 ordered_map(InputIt first, InputIt last) : data(first, last) {
88 ordered_map(ordered_map &&a) =
default;
89 ordered_map &operator=(
const ordered_map &a) {
93 for (
auto &el : a.data) data.push_back(el);
98 ordered_map &operator=(ordered_map &&a) =
default;
99 ordered_map(std::initializer_list<value_type> il) : data(il) { init_data_map(); }
102 iterator begin() noexcept {
return data.begin(); }
103 const_iterator begin() const noexcept {
return data.begin(); }
104 iterator end() noexcept {
return data.end(); }
105 const_iterator end() const noexcept {
return data.end(); }
106 reverse_iterator rbegin() noexcept {
return data.rbegin(); }
107 const_reverse_iterator rbegin() const noexcept {
return data.rbegin(); }
108 reverse_iterator rend() noexcept {
return data.rend(); }
109 const_reverse_iterator rend() const noexcept {
return data.rend(); }
110 const_iterator cbegin() const noexcept {
return data.cbegin(); }
111 const_iterator cend() const noexcept {
return data.cend(); }
112 const_reverse_iterator crbegin() const noexcept {
return data.crbegin(); }
113 const_reverse_iterator crend() const noexcept {
return data.crend(); }
115 bool empty() const noexcept {
return data.empty(); }
116 size_type size() const noexcept {
return data_map.size(); }
117 size_type max_size() const noexcept {
return data_map.max_size(); }
118 bool operator==(
const ordered_map &a)
const {
return data == a.data; }
119 bool operator!=(
const ordered_map &a)
const {
return data != a.data; }
120 bool operator<(
const ordered_map &a)
const {
127 auto it = a.data_map.begin();
128 for (
auto &el : data_map) {
129 if (it == a.data_map.end())
return false;
130 if (mapcmp()(el.first, it->first))
return true;
131 if (mapcmp()(it->first, el.first))
return false;
134 return it != a.data_map.end();
141 iterator find(
const key_type &a) {
return tr_iter(data_map.find(&a)); }
142 const_iterator find(
const key_type &a)
const {
return tr_iter(data_map.find(&a)); }
143 size_type count(
const key_type &a)
const {
return data_map.count(&a); }
144 iterator lower_bound(
const key_type &a) {
return tr_iter(data_map.lower_bound(&a)); }
145 const_iterator lower_bound(
const key_type &a)
const {
146 return tr_iter(data_map.lower_bound(&a));
148 iterator upper_bound(
const key_type &a) {
return tr_iter(data_map.upper_bound(&a)); }
149 const_iterator upper_bound(
const key_type &a)
const {
150 return tr_iter(data_map.upper_bound(&a));
152 iterator upper_bound_pred(
const key_type &a) {
153 auto ub = data_map.upper_bound(&a);
154 if (ub == data_map.begin())
return end();
155 return tr_iter(--ub);
157 const_iterator upper_bound_pred(
const key_type &a)
const {
158 auto ub = data_map.upper_bound(&a);
159 if (ub == data_map.begin())
return end();
160 return tr_iter(--ub);
163 V &operator[](
const K &x) {
165 if (it == data.end()) {
166 it = data.emplace(data.end(), x, V());
167 data_map.emplace(&it->first, it);
171 V &operator[](K &&x) {
173 if (it == data.end()) {
174 it = data.emplace(data.end(), std::move(x), V());
175 data_map.emplace(&it->first, it);
179 V &at(
const K &x) {
return data_map.at(&x)->second; }
180 const V &at(
const K &x)
const {
return data_map.at(&x)->second; }
182 template <
typename KK,
typename... VV>
183 std::pair<iterator, bool> emplace(KK &&k, VV &&...v) {
185 if (it == data.end()) {
186 it = data.emplace(data.end(), std::piecewise_construct_t(), std::forward_as_tuple(k),
187 std::forward_as_tuple(std::forward<VV>(v)...));
188 data_map.emplace(&it->first, it);
189 return std::make_pair(it,
true);
191 return std::make_pair(it,
false);
193 template <
typename KK,
typename... VV>
194 std::pair<iterator, bool> emplace_hint(iterator pos, KK &&k, VV &&...v) {
197 if (it == data.end()) {
198 it = data.emplace(pos, std::piecewise_construct_t(), std::forward_as_tuple(k),
199 std::forward_as_tuple(std::forward<VV>(v)...));
200 data_map.emplace(&it->first, it);
201 return std::make_pair(it,
true);
203 return std::make_pair(it,
false);
206 std::pair<iterator, bool> insert(
const value_type &v) {
207 auto it = find(v.first);
208 if (it == data.end()) {
209 it = data.insert(data.end(), v);
210 data_map.emplace(&it->first, it);
211 return std::make_pair(it,
true);
213 return std::make_pair(it,
false);
218 std::pair<iterator, bool> insert(iterator pos,
const value_type &v) {
220 auto it = find(v.first);
221 if (it == data.end()) {
222 it = data.insert(pos, v);
223 data_map.emplace(&it->first, it);
224 return std::make_pair(it,
true);
226 return std::make_pair(it,
false);
228 template <
class InputIterator>
229 void insert(InputIterator b, InputIterator e) {
230 while (b != e) insert(*b++);
235 template <
class InputIterator>
236 void insert(iterator pos, InputIterator b, InputIterator e) {
238 while (b != e) insert(pos, *b++);
241 iterator erase(const_iterator pos) {
242 auto it = data_map.find(&pos->first);
243 assert(it != data_map.end());
246 auto list_it = it->second;
248 return data.erase(list_it);
250 size_type erase(
const K &k) {
252 if (it != data.end()) {
260 template <
class Compare>
261 void sort(Compare comp) {