我对c ++很陌生,对这个指针和东西感到头痛!
我需要遍历链表的结构列表,读取结构的数据并弹出该条目!
这是我的结构:
struct node {
map<string,double> candidates;
double pathCost;
string source;
node *next; // the reference to the next node
};
通过阅读this帖子,我创建了我的列表:
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&lt; _Tp&gt; :: operator-&gt;()',这是 指针类型'node * const'(也许你打算使用' - &gt;'?)make:*** [main3.o]错误1
看起来我的迭代器指向列表内部,而不是列表本身!
你能告诉我这里有什么问题吗?!
答案 0 :(得分: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();
}
答案 1 :(得分: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