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

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

(跟进this question

【问题讨论】:

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

标签: c++ stl iterator


【解决方案1】:

不,这是不可能的。

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

【讨论】:

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