摘要自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