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

如果您需要做的就是删除元素,请使用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 回答
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 回答