我对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();
}
这给了我这个错误:
错误:请求'中的成员'pop_front'*it.std::_List_const_iterator<_Tp>::operator->()',属于指针类型'node*const'(可能您打算使用'->'?)make:***[main3.o]错误1
看起来我的迭代器指向的是列表内部,而不是列表本身!
你能告诉我这里出了什么问题吗?!
如果您的目标是拥有节点结构的单个列表,那么就不需要自己管理下一个指针。插入将保持不变(减去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
如果只需要删除元素,请使用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();
}