据说std :: deque swap函数需要恒定时间,而不是线性。 http://www.cplusplus.com/reference/deque/deque/swap-free/。那么该功能是如何实现的?
答案 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(复制和交换习语)与交换的实现方式有关。