具有恒定复杂度的deque交换函数的实现

时间:2017-09-29 07:24:02

标签: c++ implementation stddeque

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

2 个答案:

答案 0 :(得分:2)

所有可调整大小的标准库容器(即除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);
  }
};

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

答案 1 :(得分:0)

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

This post(复制和交换习语)与交换的实现方式有关。