如果您只有指向要删除元素的迭代器,那么是否可以从std :: list
中删除该元素?我有大量的函数使用列表元素的迭代器,如果必须将拥有的list
传递给它们中的每一个,这将是一个巨大的不便。
编辑:
你不能使用单个迭代器。
如果你有begin/end迭代器,你可以使用 std::remove
算法将所有要删除的元素移动到末尾,并在稍后的时间点删除它们。
如果你没有这些迭代器,或者以上方法在你当前的设计中不可行,我建议修改你的函数以接受一个 std::pair<std::list<T>, std::list<T>::iterator>
或类似的东西。
std::pair
)来实现,因此我将把它标记为答案。 - Seth Carnegiestd::remove()
不一定会将要删除的对象移动到末尾。它对它们发生的事情没有任何声明。对于std::vector
,我确信所有实现都只会覆盖它们。对于std::list
,我不确定。 - sbi使用标准库无法实现该功能,但您可以使用Boost的intrusive list http://www.boost.org/doc/libs/1_37_0/doc/html/boost/intrusive/list.html来实现此接口。
虽然其他人提到你做不到它,但我认为我可以解释为什么。
我相信特定的技术原因(而不是设计原因)是由于列表进行了一些维护工作,例如跟踪大小等,这要求必须通过它们传递某些操作来允许进行维护。
正因为如此,任何可能提供的黑客都很可能失败。
list
是一个双向链表,您是否可以编写一个函数来操作next
和previous
指针以删除元素?或者那样做会非常糟糕吗?还是只是因为成员是私有的? - Seth Carnegie您可以手动完成此操作。迭代器将_M_node
公开为当前节点。您可以执行以下操作:
itr._M_node->_M_prev->_M_next = itr._M_node._M_next;
_M_next
的 _M_prev
指针(因为它是一个双向链表)。我也考虑过这个问题,但是这段代码需要在不同的版本/编译器上工作。 - Seth Carnegiesize()
和O(1) splice()
之间选择)。 - André Caron
list
,这不会使其他迭代器无效,即使你从中删除一个项目。另外@nj,我认为这与本问题无关。 - Seth Carnegie