【问题标题】:Constant time removing element in an stl container恒定时间删除 stl 容器中的元素
【发布时间】:2017-12-19 15:51:06
【问题描述】:

简单问题:是否有任何 STL 容器可以让我在恒定时间内删除当前迭代器位置?
提前致谢!

【问题讨论】:

  • 注意:不过,如果您支持其他操作,请考虑(测量)vector。双链表开销很大
  • 值得注意的是,任何未排序的容器都可以将任意位置的元素与容器末尾(或开头)的元素交换,然后删除最后一个/第一个元素。这允许在恒定时间内删除,前提是交换相关容器的 value_type 可以在恒定时间内完成。此技术已在 CppCon 2016 上的 this talk 中进行了解释
  • 任何基于节点的容器都应该有恒定时间删除。

标签: c++ stl


【解决方案1】:

std::list 具有 erase 的复杂性:

复杂性

1) 常数。

2) 第一个和最后一个之间的距离成线性关系。

在案例 2 中,您对一系列元素使用擦除。

从文档中,std::list<T>::erase 看起来像这样:

//(1)
iterator erase( iterator pos );
iterator erase( const_iterator pos );
//(2)   
iterator erase( iterator first, iterator last );
iterator erase( const_iterator first, const_iterator last );

另一个是std::forward_list(不完全相同,因为它只有erase_after

【讨论】:

    【解决方案2】:

    至少 std::list 允许在恒定时间内擦除元素。

    【讨论】:

      【解决方案3】:

      如果您不需要维护元素的顺序,您可以将std::vector 与“swap and pop”一起使用 - 您将要删除的元素与向量中的最后一个元素交换,然后弹出新的最后一个元素。

      【讨论】:

      • 这是否与从链表中删除元素一样快?
      • @AryanParekh 它们都是 O(1),我认为向量会更快,因为它对缓存更友好。您可以对其进行基准测试,看看是否适合您。
      • 但是假设我想交换 vec[vec.size-1]x。还是要找到 x 对吗?
      • @AryanParekh 如果您必须先找到它,那是另一个问题。该问题表明已经有一个可用的迭代器,因此无需搜索。
      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 2018-07-02
      相关资源
      最近更新 更多