18 template<
typename Tkey,
typename Tvalue,
typename Tcompare>
29 template<
class Tmap_iter,
class Tlist_iter,
class Tkey,
class Tvalue,
class Tcompare>
32 friend class MultiMap<Tkey, Tvalue, Tcompare>;
61 template<
class Tnon_const>
82 template<
class Tnon_const>
97 assert(!this->
map_iter->second.empty());
100 this->
map_iter->second.begin().operator*();
109 assert(!this->
map_iter->second.empty());
112 this->
map_iter->second.begin().operator->();
115 inline const Tmap_iter &GetMapIter()
const {
return this->
map_iter; }
116 inline const Tlist_iter &GetListIter()
const {
return this->
list_iter; }
117 inline bool ListValid()
const {
return this->
list_valid; }
119 const Tkey &GetKey()
const {
return this->
map_iter->first; }
129 assert(!this->
map_iter->second.empty());
166 assert(!this->
map_iter->second.empty());
170 assert(!this->
map_iter->second.empty());
204 template<
class Tmap_iter1,
class Tlist_iter1,
class Tmap_iter2,
class Tlist_iter2,
class Tkey,
class Tvalue1,
class Tvalue2,
class Tcompare>
207 if (iter1.GetMapIter() != iter2.GetMapIter())
return false;
208 if (!iter1.ListValid())
return !iter2.ListValid();
209 return iter2.ListValid() ?
210 iter1.GetListIter() == iter2.GetListIter() :
false;
221 template<
class Tmap_iter1,
class Tlist_iter1,
class Tmap_iter2,
class Tlist_iter2,
class Tkey,
class Tvalue1,
class Tvalue2,
class Tcompare>
224 return !(iter1 == iter2);
235 template<
class Tmap_iter1,
class Tlist_iter1,
class Tmap_iter2,
class Tkey,
class Tvalue,
class Tcompare >
238 return !iter1.ListValid() && iter1.GetMapIter() == iter2;
247 template<
class Tmap_iter1,
class Tlist_iter1,
class Tmap_iter2,
class Tkey,
class Tvalue,
class Tcompare >
250 return iter1.ListValid() || iter1.GetMapIter() != iter2;
259 template<
class Tmap_iter1,
class Tlist_iter1,
class Tmap_iter2,
class Tkey,
class Tvalue,
class Tcompare >
262 return !iter1.ListValid() && iter1.GetMapIter() == iter2;
271 template<
class Tmap_iter1,
class Tlist_iter1,
class Tmap_iter2,
class Tkey,
class Tvalue,
class Tcompare >
274 return iter1.ListValid() || iter1.GetMapIter() != iter2;
285 template<
typename Tkey,
typename Tvalue,
typename Tcompare = std::less<Tkey> >
286 class MultiMap :
public std::map<Tkey, std::list<Tvalue>, Tcompare > {
288 typedef typename std::list<Tvalue> List;
289 typedef typename List::iterator ListIterator;
290 typedef typename List::const_iterator ConstListIterator;
292 typedef typename std::map<Tkey, List, Tcompare > Map;
293 typedef typename Map::iterator MapIterator;
294 typedef typename Map::const_iterator ConstMapIterator;
307 assert(!list.empty());
317 list.erase(list.begin());
318 if (list.empty()) this->Map::erase(it.
map_iter++);
328 void Insert(
const Tkey &key,
const Tvalue &val)
330 List &list = (*this)[key];
332 assert(!list.empty());
342 for (ConstMapIterator it = this->Map::begin(); it != this->Map::end(); ++it) {
343 ret += it->second.size();
364 MapIterator begin(this->lower_bound(key));
365 if (begin != this->Map::end() && begin->first == key) {
366 MapIterator end = begin;
367 return std::make_pair(begin, ++end);
369 return std::make_pair(begin, begin);
377 std::pair<const_iterator, const_iterator>
equal_range(
const Tkey &key)
const
379 ConstMapIterator begin(this->lower_bound(key));
380 if (begin != this->Map::end() && begin->first == key) {
381 ConstMapIterator end = begin;
382 return std::make_pair(begin, ++end);
384 return std::make_pair(begin, begin);