2012-12-24 87 views
2

我有这个测试程序。我不知道如何使用迭代器删除列表中的结构。使用迭代器从STL列表中删除C++结构

#include<iostream> 
#include<list> 
using namespace std; 
typedef struct Node 
{ 
    int * array; 
    int id; 
}Node; 

void main() 
{ 
    list<Node> nlist; 
    for(int i=0;i<3;i++) 
    { 
     Node * p = new Node;//how to delete is later? 

     p->array = new int[5];//new array 
     memset(p->array,0,5*sizeof(int)); 

     p->id = i; 

     nlist.push_back(*p);//push node into list 
    } 

    //delete each struct in list 
    list<Node>::iterator lt = nlist.begin(); 
    while(lt != nlist.end()) 
    { 
     delete [] lt->array; 

     delete &(*lt);//how to delete the "Node"? 

     lt++; 
    } 
} 

我知道如何分别删除结构。它是这样的:

Node * p = new Node; 
p->array = new int[5]; 

delete [] p->array; //delete the array 
delete p;//delete the struct 

然而,当推回列表,我不知道如何根据列表迭代器将其删除。

list<Node>::iterator lt = nlist.begin(); 
while(lt != nlist.end()) 
{ 
    delete [] lt->array; 

    delete &(*lt);//how to delete the "Node"? 

    lt++; 
} 
+1

为什么你动态地分配它呢? – chris

+0

这只是一个例子,我的程序不是这样的。 – Terry

回答

0

既然你与list<Node>当你宣布名单:

nlist.push_back(*p) 

它实际上是创建一个Node(),并从该节点复制数据您刚才动态分配但不使用实际的指针。然后你尝试从对象中删除的指针,系统将自动删除:

delete &(*lt); // this causes double free 

您需要声明像list<Node*>列表,使得指针被插入到列表中。虽然你真的不应该用这种在C++中的分配,与一对夫妇的修改处理您的代码应工作:

int main() 
{ 
    list<Node*> nlist; 
    for(int i=0;i<3;i++) 
    { 
    Node *p = new Node;//how to delete is later? 

    p->array = new int[5];//new array 
    memset(p->array,0,5*sizeof(int)); 

    p->id = i; 

    nlist.push_back(p);//push node into list 
    } 

    //delete each struct in list 
    list<Node*>::iterator lt = nlist.begin(); 
    while(lt != nlist.end()) 
    { 
    delete [] (*lt)->array; 

    delete *lt;//how to delete the "Node"? 

    lt++; 
    } 

    return 0; 
} 
+0

非常感谢,现在我知道原因。 – Terry

0

使用list.erase 但你真的这样做,不C++的方式。你不需要用new来分配int [5]。写int [5]做你想要的。您的节点类型以c-way方式定义。在C++中,你不需要用其包装的typedef

+0

哦,是的,我写了很多C,并试图学习C++。分配int [5]是因为我需要它们是动态分配。 – Terry

1

您可以使用list erase在列表之间随时随地删除节点。

list<Node>::iterator it = nlist.begin(); 
advance(it,n); \\n is the node you want to delete, make sure its less than size of list 
it = mylist.erase (it); 

另外,如果你想从列表中删除的任一端的元素,你可以使用 pop_backpop_front成员函数。

+0

我试过了,但没有奏效。 – Terry