关注问题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
中的元素。但是,我怎样才能实现第二种选择呢?
答案 0 :(得分:4)
只需跳过li = &(*absorbed)
行即可正常使用。
答案 1 :(得分:3)
您无法从std::list<T>::iterator
获得T*
。您必须使用原始li
来执行迭代器操作。
答案 2 :(得分:3)
只需删除即可!
如果您要删除它,则无需尝试重新设置值。
答案 3 :(得分:0)
而不是
// Now, absorbed should be deleted from list
li = & (* absorbed);
clusters.erase(li);
使用:
clusters.pop_front();
如果你总是处理第一个元素。
无法从值获取迭代器。不是原因,但相同的值可以在多个容器中,也可以多在一个容器中。