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