仅通过迭代器删除 STL 容器元素
Posted
技术标签:
【中文标题】仅通过迭代器删除 STL 容器元素【英文标题】:Deleting STL-container element via iterator only 【发布时间】:2017-01-27 00:26:39 【问题描述】:有没有办法仅通过指向要删除的元素的迭代器从STL
容器(无论是list
,vector
,...)中删除一个元素,但是 没有 提供它所在的容器对象(即不直接使用容器成员函数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 容器元素的主要内容,如果未能解决你的问题,请参考以下文章
C++ STL容器在for循环中删除迭代器 正确方法 it++正确吗