c++ - 是否可以按值删除队列元素?

标签 c++ stl queue std

我想从队列中删除具有特定值的元素。如何做这样的事情? (我正在尝试创建映射和队列的并发混合,目前我尝试在 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

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

最佳答案

双端队列是一个序列容器,因此您只能按 删除元素,最好使用删除/删除习惯用法:

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

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

如果你使用的是std::queue适配器,那么你根本不能这样做,因为适配器只暴露了front/back 接口(interface),不适用于迭代或查找语义。

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

关于c++ - 是否可以按值删除队列元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7705222/

相关文章:

c++ - 你能用 lambda 比较器交换 std::queue 吗?

c++ - 覆盖 fstream 的 streambuf

python - 在 python 中使用队列

c++ - 为什么我无法编译这个简单的线程测试?

C++ 将指向临时对象(在堆上)的指针传递给函数的方法?

c++ - GLEW 未初始化;抛出 "Missing OpenGL Version"

c++ - 错误 : redefinition of class

c++ - 使用 std::allocator 解除分配

java - 两个对象之间的元素流?

python - 如何在python中将项目放在队列的顶部?