从指针获取迭代器

时间:2012-04-18 12:08:24

标签: c++ pointers iterator

关注问题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 个答案:

答案 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();

如果你总是处理第一个元素。

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