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