C++ 使用指针而不是迭代器删除std::list中的元素

C++ 使用指针而不是迭代器删除std::list中的元素,c++,list,sorting,pointers,priority-queue,C++,List,Sorting,Pointers,Priority Queue,正如标题所述,我使用的是std::list。我在master.list中有对象。然后我使用一个名为sortedList的std::priority_queue或任何东西来存储指向我的master.list中对象的指针,现在所有的对象都在这个sortedList中排序。因为它已排序,所以我可以使用sortedList.pop()删除它们 问题是我如何才能优雅地将对象移回我原来的master.list 我想使用擦除,但它只需要迭代器,而我只有指针。因为我想要速度,我真的不想在这里使用remove。为

正如标题所述,我使用的是
std::list
。我在
master.list
中有对象。然后我使用一个名为
sortedList
std::priority_queue
或任何东西来存储指向我的
master.list
中对象的指针,现在所有的对象都在这个
sortedList
中排序。因为它已排序,所以我可以使用
sortedList.pop()
删除它们

问题是我如何才能优雅地将对象移回我原来的
master.list


我想使用
擦除
,但它只需要迭代器,而我只有指针。因为我想要速度,我真的不想在这里使用
remove

为什么不在优先级队列中存储迭代器而不是原始指针?因为您使用的是列表,所以不需要担心迭代器失效。然后您可以使用
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);
typedef std::list MyListT;
typedef std::priority_queue myqueue;
迈利斯特迈利斯特;
myQueue-myQueue;
myList.push_front(T());
myQueue.push_back(myList.begin());
//后来。。。
MyListT::迭代器itr=myQueue.front();
myQueue.pop_back();
myList.erase(itr);

为什么不在优先级队列中存储迭代器而不是原始指针?因为您使用的是列表,所以不需要担心迭代器失效。然后您可以使用
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);
typedef std::list MyListT;
typedef std::priority_queue myqueue;
迈利斯特迈利斯特;
myQueue-myQueue;
myList.push_front(T());
myQueue.push_back(myList.begin());
//后来。。。
MyListT::迭代器itr=myQueue.front();
myQueue.pop_back();
myList.erase(itr);

不要在优先级队列中存储指针,而是存储列表迭代器。不要在优先级队列中存储指针,而是存储列表迭代器。优先级队列需要一个比较器,但是这里的
typedef
s消除了所有“丑陋语法”的缺点。优先级队列需要一个比较器,但是这里的
typedef
s消除了所有“丑陋语法”的缺点。