繁体   English   中英

具有恒定复杂度的双端队列的交换功能的实现

[英]Implementation of swap function for deque with constant complexity

据说std :: deque交换函数需要固定的时间,不是线性的。 http://www.cplusplus.com/reference/deque/deque/swap-free/ 那么该功能如何实现?

所有可调整大小的标准库容器(即std::array之外的所有容器)都必须将其内容存储在动态分配的内存中。 这是因为它们可以任意增大,并且无法在容器对象本身占据的固定空间中任意存储许多对象。 换句话说, container.size() > sizeof(container)必须是可能的。

这意味着容器对象仅存储指向其内容的指针 ,而不存储内容本身。 因此,交换两个容器意味着只需交换这些指针即可。 以极其简化的形式:

template <class T>
class Container
{
  T *_begin, *_end;

  friend void swap(Container &a, Container &b)
  {
    std::swap(a._begin, b._begin);
    std::swap(a._end, b._end);
  }
};

当然,实际上,由于分配器等的存在,这很复杂,但是原理是相同的。

通常使用pimpl习惯用法来隐藏双端队列的实现(每个双端队列都包含一个指向实现的指针)。 然后交换指针。 (也可能是)双端队列至少持有一个指向其缓冲区的指针,然后将其交换(与大小相关的成员)。

这篇文章(复制和交换习惯用法)与交换的实现方式有关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM