Можно ли удалить элемент очереди по значению?

Я хочу, чтобы удалить элемент из очереди с определенным значением. Как это сделать? (Я пытаюсь создать параллельную смесь карты и очереди, и в настоящее время я пытаюсь реализовать на ответ)

поэтому у меня в настоящее время есть такой код:

#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);, а также поддержка поиска и удаления ценность?

2 ответов


deque-это контейнер последовательности, поэтому вы можете удалять элементы только с помощью стоимостью, что лучше всего сделать с идиомой удаления / стирания:

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

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

если вы используете std::queue адаптер, то вы не можете сделать это вообще, потому что адаптер предоставляет только front/back интерфейс и не предназначен для семантики итерации или поиска.

если вы решите реализовать свою очередь как std::list, затем используйте функцию-член remove() вместо.


Dointg это так - как с очередью, так и с картой удаляет преимущества использования либо и сохраняет недостатки обоих (по крайней мере, с точки зрения performace). Я бы просто использовал deque<std::pair<map_t_1, map_t_2> > для представления как карты, так и deque. Затем поиск или редактирование карты требует просмотра всего deque, поэтому это не очень эффективно.

более эффективное решение будет сложнее достичь, так как вы пытаетесь справиться с двумя различными схемами индексирования-по ключу (map) и по индексу (требуется заказ природы od deque). Чтобы сделать это эффективно, я бы предложил самореализованный двойной связанный список (как очередь) с картой ключей для записей linked_list. Записи двойного связанного списка также будут содержать ключ для поиска на карте при добавлении / добавлении очереди.