2

私はこのテストプログラムを持っています。イテレータを使用してリスト内の構造体を削除する方法がわかりません。

#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++;
}
4

3 に答える 3

1

リスト消去を使用して、リスト間の任意の場所からノードを削除できます。

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メンバー関数を使用できます。

于 2012-12-24T07:56:23.850 に答える
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;
}
于 2012-12-24T07:13:36.790 に答える
0

list.eraseを使用し ますが、実際にはC++以外の方法で実行しています。newでint[5]を割り当てる必要はありません。int [5]を書くことは、あなたが望むことをします。c-wayで定義されたノードタイプ。C ++では、typedefでラップする必要はありません。

于 2012-12-24T07:10:32.853 に答える