2011-10-09 43 views
6

我想从具有特定值的队列中移除元素。如何做这样的事情? (我想创建地图和队列的同时混合,目前我尝试落实this answer是否可以按值删除队列元素?

所以我现在有这样的代码:

#ifndef CONCURRENT_QUEUED_MAP_H 
#define CONCURRENT_QUEUED_MAP_H 

#include <map> 
#include <deque> 
#include <boost/thread.hpp> 
#include <boost/thread/locks.hpp> 

template <class map_t_1, class map_t_2> 
class concurrent_queued_map 
{ 
private: 
    std::map<map_t_1, map_t_2> _ds; 
    std::deque<map_t_1> _queue; 
    mutable boost::mutex mut_; 
public: 
    concurrent_queued_map() {} 

    map_t_2 get(map_t_1 key) { 
     boost::mutex::scoped_lock lock(mut_); 
     return _ds[key]; 
    } 

    map_t_1 put(map_t_1 key, map_t_2 value) { 
     boost::mutex::scoped_lock lock(mut_); 
     _ds.insert(std::pair<map_t_1, map_t_2>(key,value)); 
     _queue.push_back(key); 
     return key; 
    } 

    map_t_2 get_last(map_t_1 key) { 
     boost::mutex::scoped_lock lock(mut_); 
     const map_t_1 k = _queue.front(); 
     return _ds[k]; 
    } 

    void remove_last(map_t_1 key) { 
     boost::mutex::scoped_lock lock(mut_); 
     const map_t_1 k = _queue.front(); 
     _ds.erase(k); 
     _queue.pop_front(); 
    } 

    void remove(map_t_1 key) { 
     boost::mutex::scoped_lock lock(mut_); 
     _queue.erase(std::remove(_queue.begin(), _queue.end(), key), _queue.end()); 
     _ds.erase(k); 
    } 

    int size() { 
     boost::mutex::scoped_lock lock(mut_); 
     return _ds.size(); 
    } 

}; 

#endif // CONCURRENT_QUEUED_MAP_H 

那么我该怎么办?如何从值队列中删除?或者thare是任何类似队列的STL或Boost组件?这意味着它会有.front(),pop_front();push_back(key);并且还支持按值搜索和擦除?

+0

你能否更简洁明了地说出你的问题?一个队列没有“键”,所以你的问题没有意义;它是一个只有*值*的序列容器。 –

回答

18

甲双端队列是一个序列容器中,因此只有通过,其是与删除/擦除成语最好做删除元素:

std::deque<T> q; 
T val; 

q.erase(std::remove(q.begin(), q.end(), val), q.end()); 

如果使用的std::queue适配器,则完全不能这样做,因为适配器只公开接口并且不用于迭代或查找语义。

如果您选择将您的队列实施为std::list,请改为使用成员函数remove()

+0

'q.erase(val)'和'q.erase(std :: remove(q.begin(),q.end(),val),q.end());'? – Rella

+3

@Kabumbus不同的是,第一个不会编译,因为'erase'需要一个迭代器而不是包含的类型的值。 –

2

Dointg它这样的 - 与两个队列和地图被去除使用的优点任一,并保持二者的缺点(至少在服务表现方面)。我会简单地使用deque<std::pair<map_t_1, map_t_2> >来表示map和deque。然后地图查找或编辑需要查看整个deque,所以效率不高。

更有效的解决方案将更加难以实现,因为你正在努力应对两个不同的索引方式 - 通过钥匙(图),并通过指数(通过订购性质OD deque的需要)。为了有效地做到这一点,我会建议自己实现的双链表(作为队列)和键映射到linked_list条目。双向链接列表条目还包含预定义/附加队列时在映射中查找的键。

+0

是否有任何提升框外组件? – Rella

+0

我不是一个助推专家,但我猜测没有。 –