@@ -63,12 +63,12 @@ class flat_map_base
6363
6464 class iterator
6565 {
66+ public:
6667 using key_iter = typename key_container::iterator;
6768 using mapped_iter = typename mapped_container::iterator;
6869 key_iter _k_it;
6970 mapped_iter _v_it;
7071
71- public:
7272 using difference_type = typename key_container::difference_type;
7373 using value_type = value_proxy;
7474 using reference = value_proxy;
@@ -98,12 +98,12 @@ class flat_map_base
9898
9999 class const_iterator
100100 {
101+ public:
101102 using key_iter = typename key_container::const_iterator;
102103 using mapped_iter = typename mapped_container::const_iterator;
103104 key_iter _k_it;
104105 mapped_iter _v_it;
105106
106- public:
107107 using difference_type = typename key_container::difference_type;
108108 using value_type = value_proxy;
109109 using reference = value_proxy;
@@ -233,6 +233,46 @@ class flat_map_base
233233 }
234234 }
235235
236+ // erase by iterator
237+ iterator erase (iterator pos)
238+ {
239+ auto k_it = pos._k_it ;
240+ auto v_it = pos._v_it ;
241+ _Mykeys._Myval2 .erase (k_it);
242+ _Myvals.erase (v_it);
243+ return iterator (k_it, v_it);
244+ }
245+
246+ // erase by key
247+ size_type erase (const key_type& key)
248+ {
249+ const auto & pred = _Mykeys._Get_first ();
250+ auto k_it = std::lower_bound (_Mykeys._Myval2 .begin (), _Mykeys._Myval2 .end (), key, pred);
251+ auto v_it = _Myvals.begin () + (k_it - _Mykeys._Myval2 .begin ());
252+
253+ if (k_it == _Mykeys._Myval2 .end () || pred (key, *k_it) || pred (*k_it, key))
254+ return 0 ; // not found
255+
256+ if constexpr (_Traits::allow_duplicates)
257+ {
258+ // multimap: erase all equal keys
259+ auto k_end = std::upper_bound (k_it, _Mykeys._Myval2 .end (), key, pred);
260+ auto v_end = _Myvals.begin () + (k_end - _Mykeys._Myval2 .begin ());
261+
262+ size_type count = static_cast <size_type>(k_end - k_it);
263+ _Mykeys._Myval2 .erase (k_it, k_end);
264+ _Myvals.erase (v_it, v_end);
265+ return count;
266+ }
267+ else
268+ {
269+ // map: erase single element
270+ _Mykeys._Myval2 .erase (k_it);
271+ _Myvals.erase (v_it);
272+ return 1 ;
273+ }
274+ }
275+
236276 const auto & keys () const { return _Mykeys; }
237277
238278protected:
0 commit comments