[英]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.