仅通过迭代器删除 STL 容器元素

Posted

技术标签:

【中文标题】仅通过迭代器删除 STL 容器元素【英文标题】:Deleting STL-container element via iterator only 【发布时间】:2017-01-27 00:26:39 【问题描述】:

有没有办法仅通过指向要删除的元素的迭代器从STL 容器(无论是listvector,...)中删除一个元素,但是 没有 提供它所在的容器对象(即不直接使用容器成员函数container<T>::iterator container<T>.erase(container<T>::iterator)?

(跟进this question)

【问题讨论】:

@LCsa 您可以使用其他成员函数,例如 pop_back。:) 我时不时看到这个,并且经常想,“不间断空间的地址是什么?” @VladfromMoscow 关于它的笑话是根本不使用实际的容器。 :) 【参考方案1】:

不,这是不可能的。

想象一下,为了让标准提供一种方法来做到这一点,必须发生什么。 std::vector<T>::iterator 不可能是简单的 T*。相反,它必须包含足够的信息,以便库能够“找到”它所属的向量,例如指向向量本身的指针。因此,如果标准强制要求删除仅给定迭代器的元素,它将迫使标准库增加开销,从而减慢容器的所有用户。

【讨论】:

如果您正在处理范围,您可以以std::remove 的方式执行此操作,将所有元素向上移动,前提是您从范围开始。不过,您最后会有一个新的范围,之后可能不得不使用std::vector<>::erase 或类似的。 那么,如果我不提供迭代器指向的容器,就没有办法做到这一点?您是否知道如何解决问题(如链接问题中所述?)

以上是关于仅通过迭代器删除 STL 容器元素的主要内容,如果未能解决你的问题,请参考以下文章

STL之迭代器(iterator)

STL

C++ STL容器在for循环中删除迭代器 正确方法 it++正确吗

C++ STL容器在for循环中删除迭代器 正确方法 it++正确吗

STL的线程安全解决方案

STL源码剖析(迭代器)