deque 容器

摘要自c++手冊

  • std::deque ( double-ended queue ,雙端隊列)是有下標順序容器,它允許在其首尾兩段快速插入及刪除。
  • 在 deque 任一端插入或刪除不會非法化指向其餘元素的指針或引用
  • 與 std::vector 相反, deque 的元素不是相接存儲的:典型實現用單獨分配的固定大小數組的序列,外加額外的登記,這表示下標訪問必須進行二次指針解引用,與之相比 vector 的下標訪問只進行一次。
  • deque 的存儲按需自動擴展及收縮。
  • 擴張 deque 比擴展 std::vector 便宜,因爲它不涉及到複製既存元素到新內存位置。
  • 另一方面, deque 典型地擁有較大的最小內存開銷。
  • 只保有一個元素的 deque 必須分配其整個內部數。

deque 上常見操作的複雜度(效率)如下:

  • 隨機訪問——常數 O(1)
  • 在結尾或起始插入或移除元素——常數 O(1)
  • 插入或移除元素——線性 O(n)

更加詳細信息鏈接

個人整理後

deque 容器

/*
\ brief		頭文件
*/
#include<deque>

/*
\ brief 	模板聲明
\ param 	T  			元素類型
\ param     Allocator 	分配器(內存管理的,使用C++ 默認的即可)
\ T 	必須滿足可複製賦值 (CopyAssignable) 和可複製構造 (CopyConstructible) 的要求。
\ Allocator 	用於獲取/釋放內存及構造/析構內存中元素的分配器。
*/
template<class T, class Allocator = std::allocator<T> > 
class deque;

/*
\ brief 		成員類型
\ typedef T value_type;  等效 using value_type = T;  都是起類型別名
*/
/*
\ brief T  deque<int>  T 就相當於 int
*/
using value_type      = T;
/*
\ brief Allocator類型 知道是管理內存分配和釋放的就可以了,除非你想自己實現一個分配器。
*/
using allocator_type  = Allocator;
/*
\ brief pointer  		可以理解爲 *T  
*/
using pointer         = typename _Alty_traits::pointer;
/*
\ brief const_pointer   可以理解爲 * const T
*/
using const_pointer   = typename _Alty_traits::const_pointer;
/*
\ brief reference       元素引用 
*/
using reference       = T&;
/*
\ brief const_reference 元素常量引用
*/
using const_reference = const T&;
/*
\ brief size_type      可以理解爲 unsigned int
*/
using size_type       = typename _Alty_traits::size_type;
/*
\ brief difference_type 可以理解爲 int
*/
using difference_type = typename _Alty_traits::difference_type;

/*
\ brief		默認構造函數。構造擁有默認構造的分配器的空容器
*/
deque();

/*
\ brief		構造擁有給定分配器 alloc 的空容器
\ param			用於此容器所有內存分配的分配器
*/
explicit deque( const Allocator& alloc );

/*
\ brief		構造擁有 count 個有值 value 的元素的容器
\ param		count	容器的大小
\ param		value 	以之初始化容器元素的值
\ param		alloc 	用於此容器所有內存分配的分配器
*/
explicit deque( size_type count,
                const T& value = T(),
                const Allocator& alloc = Allocator());
         deque( size_type count,
                const T& value,
                const Allocator& alloc = Allocator());


/*
\ brief		構造擁有個 count 默認插入的 T 實例的容器
\ param		容器的大小
*/
explicit deque( size_type count );

/*
\ brief		構造擁有範圍 [first, last) 內容的容器
\ InputIt 	迭代器
\ param		first	複製元素的來源範圍
\ param		last	複製元素的來源範圍
\ param		alloc 	用於此容器所有內存分配的分配器
*/
template< class InputIt >
deque( InputIt first, InputIt last,
       const Allocator& alloc = Allocator() );

/*
\ brief		構造擁有 other 內容的容器
\ param		other 用作初始化容器元素來源的另一容器
*/
deque( const deque& other );

/*
\ brief		構造擁有 other 內容的容器
\ param		other 用作初始化容器元素來源的另一容器
\ param		alloc 用於此容器所有內存分配的分配器
*/
deque( const deque& other, const Allocator& alloc );

/*
\ brief		用移動語義構造擁有 other 內容的容器
\ param		other 用作初始化容器元素來源的另一容器(必須具有移動語義)
*/
deque( deque&& other );

/*
\ brief		用移動語義構造擁有 other 內容的容器
\ param		other 用作初始化容器元素來源的另一容器(必須具有移動語義)
\ param		alloc 用於此容器所有內存分配的分配器
*/
deque( deque&& other, const Allocator& alloc );

/*
\ brief		銷燬容器。調用元素的析構函數,然後解分配所用的存儲。
				注意,若元素是指針,則不銷燬所指向的對象
*/
~deque();

/*
\ brief		複製賦值運算符。以 other 的副本替換內容
\ param		用作數據源的另一容器
\ return	*this
*/
deque& operator=( const deque& other );

/*
\ brief		複製賦值運算符。以 other 的副本替換內容
\ param		用作數據源的另一容器(必須具有移動語義)
\ return	*this
*/
deque& operator=( deque&& other );

/*
\ brief		以 count 份 value 的副本替換內容
\ param		count	容器的新大小
\ param		value 	用以初始化容器元素的值
*/
void assign( size_type count, const T& value );

/*
\ brief		以範圍 [first, last) 中元素的副本替換內容
\ InputIt   迭代器
\ param		first	複製來源元素的範圍
\ param		last 	複製來源元素的範圍
*/
template< class InputIt >
void assign( InputIt first, InputIt last );

/*
\ brief		返回與容器關聯的分配器
\ return	關聯的分配器
*/
allocator_type get_allocator() const;

/*
\ brief		返回位於指定位置 pos 的元素的引用,有邊界檢查。
\ param		要返回的元素的位置
\ return	到所需元素的引用
*/
reference       at( size_type pos );
const_reference at( size_type pos ) const;

/*
\ brief		返回位於指定位置 pos 的元素的引用。不進行邊界檢查
\ param		要返回的元素的位置
\ return	到所需元素的引用
*/
reference       operator[]( size_type pos );
const_reference operator[]( size_type pos ) const;

/*
\ brief		返回到容器首元素的引用
\ return	首元素的引用
*/
reference front();
const_reference front() const;

/*
\ brief		返回到容器中最後一個元素的引用
\ return	最後元素的引用
*/
reference back();
const_reference back() const;

/*
\ brief		返回指向容器首元素的迭代器
\ return	指向首元素的迭代器
*/
iterator begin();
iterator begin() noexcept;
const_iterator begin() const;
const_iterator begin() const noexcept;
const_iterator cbegin() const noexcept;

/*
\ brief		返回指向容器末元素後一元素的迭代器
\ return	指向後隨最後元素的迭代器
*/
iterator end();
iterator end() noexcept;
const_iterator end() const;
const_iterator end() const noexcept;
const_iterator cend() const noexcept;

/*
\ brief		返回指向逆向容器首元素的逆向迭代器
\ return	指向首元素的逆向迭代器
*/
reverse_iterator rbegin();
reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const;
const_reverse_iterator rbegin() const noexcept;
const_reverse_iterator crbegin() const noexcept;

/*
\ brief		返回指向逆向容器末元素後一元素的逆向迭代器
\ return	指向末元素後一元素的逆向迭代器
*/
reverse_iterator rend();
reverse_iterator rend() noexcept;
const_reverse_iterator rend() const;
const_reverse_iterator rend() const noexcept;
const_reverse_iterator crend() const noexcept;

/*
\ brief		檢查容器是否無元素,即是否 begin() == end() 。
\ return	若容器爲空則爲 true ,否則爲 false
*/
bool empty() const;

/*
\ brief		返回容器中的元素數,即 std::distance(begin(), end())
\ return	容器中的元素數量
*/
size_type size() const;
size_type size() const noexcept;

/*
\ brief		返回根據系統或庫實現限制的容器可保有的元素最大數量
\ return	元素數量的最大值
*/
size_type max_size() const;
size_type max_size() const noexcept;

/*
\ brief		請求移除未使用的容量
*/
void shrink_to_fit();

/*
\ brief		從容器擦除所有元素
*/
void clear();
void clear() noexcept;

/*
\ brief		在 pos 前插入 value
\ param		pos	將內容插入到其前的迭代器
\ param		value 要插入的元素值
\ return	指向被插入 value 的迭代器
*/
iterator insert( iterator pos, const T& value );
iterator insert( const_iterator pos, const T& value );

/*
\ brief		在 pos 前插入 value
\ param		pos	將內容插入到其前的迭代器
\ param		value 要插入的元素值(必須具有移動語義)
\ return	指向被插入 value 的迭代器
*/
iterator insert( const_iterator pos, T&& value );

/*
\ brief		在 pos 前插入 value 的 count 個副本
\ param		pos	將內容插入到其前的迭代器
\ param		count 數量大小
\ param		value 要插入的元素值
*/
void insert( iterator pos, size_type count, const T& value );

/*
\ brief		在 pos 前插入 value 的 count 個副本
\ param		pos	將內容插入到其前的迭代器
\ param		count 數量大小
\ param		value 要插入的元素值
\ return	指向首個被插入元素的迭代器
*/
iterator insert( const_iterator pos, size_type count, const T& value );

/*
\ brief		在 pos 前插入來自範圍 [first, last) 的元素
\ InputIt 	迭代器
\ param		pos		將內容插入到其前的迭代器
\ param		first	要插入的元素範圍
\ param		last	要插入的元素範圍
*/
template< class InputIt >
void insert( iterator pos, InputIt first, InputIt last);

/*
\ brief		在 pos 前插入來自範圍 [first, last) 的元素
\ InputIt 	迭代器
\ param		pos		將內容插入到其前的迭代器
\ param		first	要插入的元素範圍
\ param		last	要插入的元素範圍
\ return	指向首個被插入元素的迭代器
*/
template< class InputIt >
iterator insert( const_iterator pos, InputIt first, InputIt last );

/*
\ brief		直接於 pos 前插入元素到容器中(元素類型必須滿足就位構造)
\ ... Args 可變參數包類型
\ param		pos		將內容插入到其前的迭代器
\ param		args 	轉發給元素構造函數的參數
\ return	指向被安置的元素的迭代器
*/
template< class... Args >
iterator emplace( const_iterator pos, Args&&... args );

/*
\ brief		移除位於 pos 的元素
\ param		指向要移除的元素的迭代器
*/
iterator erase( iterator pos );
iterator erase( const_iterator pos );

/*
\ brief		移除範圍 [first; last) 中的元素
\ param		first	要移除的元素範圍
\ param		last	要移除的元素範圍
\ return	後隨最後被移除元素的迭代器
*/
iterator erase( iterator first, iterator last );
iterator erase( const_iterator first, const_iterator last );

/*
\ brief		後附給定元素 value 到容器尾
\ param		要後附的元素值
*/
void push_back( const T& value );

/*
\ brief		後附給定元素 value 到容器尾
\ param		要後附的元素值(必須滿足移動語義)
*/
void push_back( T&& value );

/*
\ brief		添加新元素到容器尾(元素必須滿足就位構造)
\ ... Args	可變參數包
\ param 	args	轉發到元素構造函數的參數
*/
template< class... Args >
void emplace_back( Args&&... args );

/*
\ brief		移除容器的最末元素
*/
void pop_back();

/*
\ brief		前附給定元素 value 到容器起始
\ param		要前附的元素值
*/
void push_front( const T& value );

/*
\ brief		前附給定元素 value 到容器起始
\ param		要前附的元素值(必須具有移動語義)
*/
void push_front( T&& value );

/*
\ brief		插入新元素到容器起始(必須具有就就位構造)
\ ... Args	可變參數包
\ param		args 轉發給元素構造函數的參數
*/
template< class... Args >
void emplace_front( Args&&... args );

/*
\ brief		移除容器首元素
*/
void pop_front();

/*
\ brief		重設容器大小以容納 count 個元素 則後附額外的默認插入的元素
\ param		容器大小
*/
void resize( size_type count );

/*
\ brief		重設容器大小以容納 count 個元素 則後附額外的 value 的副本
\ param		count 容器的大小
\ param		value 用以初始化新元素的值
*/
void resize( size_type count, const value_type& value );

/*
\ brief		重設容器大小以容納 count 個元素
\ param		count	容器的大小
\ param		value	用以初始化新元素的值
*/
void resize( size_type count, T value = T() );

文章時間2019年12月7日11:40:49

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章