0

私はC ++が初めてで、このポインターなどで頭痛がしました!

リンクされたリストである構造体のリストを反復処理し、構造体のデータを読み取り、そのエントリをポップする必要があります!

これは私の構造体です:

struct node {
    map<string,double> candidates;
    double pathCost;
    string source;
    node *next;             // the reference to the next node
};

この投稿を読んで、次のようなリストを作成します。

list<node*> nodeKeeper;

次に、最初の値を初期化しました。

    node *head;
    head= new node;
    head->pathCost = 0.0;
    head->source="head";
    head->next = NULL; 

リストと構造体を薄く埋めます:

for(unsigned int i = 0; i < sourceSentence.size(); i++){

    node *newNode= new node;             //create a temporary node


    //DO STUFF HERE


    //push currunt node to stack
    nodeKeeper.push_back(newNode);

    head = newNode;

}

今、構造体のリストがあり、それを繰り返し処理して要素をポップしたい:

for (list<node*>::const_iterator it=nodeKeeper.begin();it!=nodeKeeper.end();it++){

    it->pop_front();

}

これは私にこのエラーを与えます:

エラー: '* it.std::_List_const_iterator<_Tp>::operator->()' 内のメンバー 'pop_front' の要求、これはポインター型 'node* const' です (おそらく '->' を使用するつもりでしたか? ) make: *** [main3.o] エラー 1

私のイテレータは、リスト自体ではなく、リスト内を指しているようです!

ここで何が問題なのか教えてもらえますか?!

4

2 に答える 2

2

ノード構造体の単一のリストを作成することが目標の場合、次のポインターを自分で管理する必要はありません。挿入は同じままです(head =行を除く)

リストのすべての要素をポップするには、次のようにします

int sizeOfList = nodeKeeper.size();
for( int i =0; i < sizeOfList; i++) {
    //if you want to do something with the last element
    node * temp = nodeKeeper.back();
    //do stuff with that node

    //done with the node free the memory
    delete temp;
    nodeKeeper.pop_back();
}

コンパイル/実行例: http://ideone.com/p6UlyN

于 2013-02-18T23:49:47.497 に答える
2

要素を削除するだけでよい場合は、次を使用しますstd::list::clear

nodeKeeper.clear();

要素の内容を読み取ってから削除するには、次のようにします。

for (std::list<node*>::const_iterator it = nodeKeeper.begin(); it != nodeKeeper.end(); ++it) {
    std::cout << (*it)->source;
    // do more reading

    nodeKeeper.pop_front();
}

または C++11 の場合:

for (const auto& a : nodeKeeper) {
    std::cout << a->source;

    nodeKeeper.pop_front();
}
于 2013-02-18T23:44:50.587 に答える