簡體   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