2012-12-24 117 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