52 template<
typename _Key,
typename _Value,
typename _KeyComp=std::greater<_Key>,
typename _ValueComp=std::less<_Value> >
56 typedef typename std::multimap<_Key,_Value,_KeyComp>::const_iterator iterator;
57 typedef typename std::multimap<_Key,_Value,_KeyComp>::const_iterator const_iterator;
69 mutable_priority_queue(
const _KeyComp &keyComp,
const _ValueComp &valComp ) : key2Val(keyComp), val2Key(valComp) { }
87 inline iterator begin(){
88 return key2Val.begin();
92 inline iterator end(){
103 inline void erase( _Value val ){
104 typename std::map<_Value,_Key,_ValueComp>::iterator iter=val2Key.find( val );
105 if( iter != val2Key.end() ){
106 key2Val.erase( _find(iter->second,iter->first) );
107 val2Key.erase( iter );
113 return key2Val.empty();
117 inline _Value front_value(){
118 return (*key2Val.begin()).second;
122 inline _Value front_key(){
123 return (*key2Val.begin()).first;
128 auto iter = key2Val.begin();
133 inline void push( _Value val, _Key key ){
142 inline void insert( _Value val, _Key key ){
144 key2Val.insert( std::pair<_Key,_Value>( key, val ) );
145 val2Key.insert( std::pair<_Value,_Key>( val, key ) );
151 inline void update( _Value val, _Key key ){
156 inline size_t size(){
157 return key2Val.size();
160 inline size_t count(_Value val)
162 return val2Key.count(val);
166 std::multimap< _Key, _Value, _KeyComp > key2Val;
167 std::map< _Value, _Key, _ValueComp > val2Key;
169 inline void _erase(
typename std::multimap<_Key,_Value,_KeyComp>::iterator it ){
170 val2Key.erase( it->second );
174 inline typename std::multimap<_Key,_Value,_KeyComp>::iterator _find( _Key k, _Value v ){
175 typename std::multimap<_Key,_Value,_KeyComp>::iterator it = key2Val.lower_bound(k);
176 typename std::multimap<_Key,_Value,_KeyComp>::iterator hi = key2Val.upper_bound(k);
178 if( it->second == v )
182 return key2Val.end();