将指针从一个列表移动到另一个列表而不破坏对象

时间:2014-03-10 17:08:51

标签: c++ list pointers

考虑以下代码:

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

2 个答案:

答案 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());
}