考虑以下代码:
transferPtr(Node *moveMe, list<Node*> &listA, list<Node*> &listB) {
// How do I remove moveMe from A?
listB.push_back(moveMe);
}
假设指针moveMe
(指向节点或任何对象的指针)在listA
中,但我们只给出了指针,而不是迭代器。我们正在moveMe
移出listA
并进入listB
。
如何从moveMe
删除listA
?
答案 0 :(得分:2)
listA.remove(moveMe);
应该这样做。
由于您只删除了指针,因此不会销毁该对象。
答案 1 :(得分:0)
通过使用list splice函数,您可以避免列表节点的内存分配。 使用remove()无论如何都必须搜索列表。
list<Node*>::iterator i = std::find(listA.begin(), listA.end(), moveMe);
if (i != listA.end()) {
listB.splice(listB.end(), listA, i);
}
如果指针在列表A中存在的次数超过1次,那么您将需要使用类似下面的内容,但是您的STL实现可能不会像您希望的那样有效地执行此操作。
list<Node*>::iterator i = std::remove(listA.begin(), listA.end(), moveMe);
if (i != listA.end()) {
listB.splice(listB.end(), listA, i, listA.end());
}