Можно ли удалить элемент очереди по значению?
Я хочу, чтобы удалить элемент из очереди с определенным значением. Как это сделать? (Я пытаюсь создать параллельную смесь карты и очереди, и в настоящее время я пытаюсь реализовать на ответ)
поэтому у меня в настоящее время есть такой код:
#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. Записи двойного связанного списка также будут содержать ключ для поиска на карте при добавлении / добавлении очереди.