仅使用迭代器从列表中删除元素

时间:2011-07-30 17:36:28

标签: c++ list iterator std

如果只有指向要删除的元素的迭代器,是否可以从std::list中删除元素?我有大量的函数需要迭代器来列出元素,并且必须将拥有list传递给它们中的每一个都会非常不方便。

6 个答案:

答案 0 :(得分:3)

编辑:

你不能使用单个迭代器。

如果你有开始/结束迭代器,你可以使用std::remove算法将你要擦除的所有元素移到最后,然后在以后删除它们。

如果您不这样做,或者上述内容对您当前的设计不可行,我建议您更改功能以获取std::pair<std::list<T>, std::list<T>::iterator>或类似内容。

答案 1 :(得分:3)

不,你不能。迭代器是在指针之后建模的轻量级对象,并且不带有对它们所引用的容器的引用。 (虽然有些实现在调试模式下内部执行。)

正如你所拥有的只是一个指向数组的指针一样,你不能从数组中“删除”一个对象,你不能在没有访问容器的情况下从容器中删除一个对象。

答案 2 :(得分:3)

你不能用标准库做到这一点,但你可以使用具有这种界面的Boost的侵入式列表http://www.boost.org/doc/libs/1_37_0/doc/html/boost/intrusive/list.html

答案 3 :(得分:1)

虽然其他人提到你不能这样做,但我想我可以提供原因。

我认为具体的技术原因(而非设计原因)是列表进行一些维护,例如跟踪大小,这需要某些操作必须通过它们才能进行维护。

正是由于这个原因,任何可能提供的黑客都可能会失败。

答案 4 :(得分:0)

不,这是不可能的。顾名思义,迭代器的工作是迭代序列的元素。查看SGI page on iterators以获取C ++标准库中迭代器设计的摘要。

答案 5 :(得分:-1)

您可以手动执行此操作。迭代器将_M_node公开为当前节点。你可以这样做:

itr._M_node->_M_prev->_M_next = itr._M_node._M_next;