2012-12-24 2 views
2

이 테스트 프로그램이 있습니다. iterator를 사용하여 목록에서 struct를 삭제하는 방법을 모르겠습니다.반복자를 사용하여 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

:

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++ 그런 식으로하고 있습니다. 새로운 int [5]를 할당 할 필요는 없습니다. int [5]를 작성하면 원하는 것을 처리 할 수 ​​있습니다. 노드 유형이 c-way로 정의되었습니다. C에서 당신은 그것을 포장 할 필요가 없습니다 ++ 형식 정의

당신이 할 때 list<Node>으로 목록을 선언하고 있기 때문에
+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_back 또는 pop_front 멤버 함수를 사용할 수 있습니다.

+0

시도했지만 작동하지 않았습니다. – Terry