2013-02-15 15 views
0

Как указано в названии, я использую std::list. У меня есть объекты в master.list. Затем я использую std::priority_queue или что-то еще, называемое sortedList для хранения указателей на объекты в моем master.list и теперь все это отсортировано в этом sortedList. Поскольку он отсортирован, я могу удалить их, используя sortedList.pop().Удаление элемента в std :: list с помощью указателя не итератора

Вопрос заключается в том, как я могу элегантно удалить объекты обратно в мой оригинальный master.list

Я хочу использовать erase, но принимать только итератор, а я просто указатель. Потому что я хочу скорость, я действительно не хочу использовать remove здесь.

+3

Не храните указатели в очереди приоритетов и вместо этого храните итераторы списка. –

+0

Керрек избил меня! –

ответ

3

Почему не хранить итераторы в очереди приоритетов вместо необработанных указателей? Поскольку вы используете список, вам не нужно беспокоиться о недействительности итератора. Тогда вы можете просто использовать std::list::erase. Накладные расходы на хранение итератора должны быть незначительными, поскольку он просто содержит указатель на узел списка.

typedef std::list<T> MyListT; 
typedef std::priority_queue<MyListT::iterator> MyQueueT; 

MyListT myList; 
MyQueueT myQueue; 

myList.push_front(T()); 
myQueue.push_back(myList.begin()); 

// Later... 

MyListT::iterator itr = myQueue.front(); 
myQueue.pop_back(); 
myList.erase(itr); 
+0

Для очереди приоритетов потребуется компаратор, но 'typedef' здесь устраняют все «уродливые синтаксисы». – Collin

Смежные вопросы