2012-04-18 55 views
0

以下问题Segmentation fault executing method我停在另一个问题。从指针获取迭代器

考虑:

Cluster * base; 
Cluster * absorbed; 

list<Cluster>::iterator li = clusters.begin(); 

// li is then pointed to some element. 

absorbed = &(*li); // Get a pointer to the chosen element. 

base->joinCluster(absorbed); // Perform an action with absorbed. 

// li contines the cycle and now point to clusters.end() 

// Now, absorbed should be deleted from list. li doesn't point to absorbed anymore. 
li = & (* absorbed); 
clusters.erase(li); 

试图做的上述相反,但G ++返回一个错误:error: no match for 'operator=' in 'li = absorbed' 我怎样才能做到这一点?

我试图避免循环遍历列表中的所有元素再次找到absorbed之一。

编辑:

很抱歉,但我知道我错过了说,经过absorbed = &(* li);li继续循环,直到clusters.end()。 因此,在周期结束时,li不再指向absorbed了。 我想我有两个选择:要么我再次循环通过clusters中的所有元素来找到absorbed元素;或者我利用absorbed指针擦除clusters中的元素。但是,我怎样才能实现第二种选择呢?

回答

4

只是跳过li = &(*absorbed)线,它应该工作正常。

3

您无法从T*获得std::list<T>::iterator。您将不得不使用原始的li来执行迭代器操作。

3

只需擦除它!
无论如何,如果您要删除它,则无需尝试重​​新输入值。

0

代替

// Now, absorbed should be deleted from list 
li = & (* absorbed); 
clusters.erase(li); 

使用:

clusters.pop_front(); 

如果你总是处理的第一要素。

无法从值中获取迭代器。不是原因,但相同的价值可以在多个容器或更多,然后在一个一个。