一、deque介绍
template < class T, class Alloc = allocator<T> >
class deque;
和 vector 容器采用连续的线性空间不同,deque 容器存储数据的空间是由一段一段等长的连续空间构成,各段空间之间并不一定是连续的,可以位于在内存的不同区域。
为了管理这些连续空间,deque 容器用数组(数组名假设为 dequeName)存储着各个连续空间的首地址。也就是说,dequeName 数组中存储的都是指针,指向那些真正用来存储数据的各个连续空间,这也就意味着对std::deque的索引访问必须执行两次指针引用(vector仅需要执行一次):
deques上常见操作的复杂度(效率)如下:
- 随机访问 - 常数O(1)
- 在末尾或开头插入或删除元素 - 常量O(1)
- 插入或删除元素 - 线性O(n)
二、deque的成员函数
1、构造函数
(1)构造一个空的deque容器,没有元素,也是默认构造函数
explicit deque(const allocator_type& alloc = allocator_type());
(2)构造一个包含n 个元素的容器,每个元素都是val的副本,若val未指定,则为默认值。
explicit deque(size_type n);
explicit deque (size_type n, const value_type& val,const allocator_type& alloc = allocator_type());
(3)构造一个包含了范围[first,last)元素的deque容器,每个元素都从该范围内的相应元素以相同的顺序就地构造。
template <class InputIterator>
deque(InputIterator first, InputIterator last,const allocator_type& alloc = allocator_type());
(4) 以deque容器x作为数据源,构造一个新list容器,其中新deque容器中的元素来自于x中元素拷贝的副本。
deque(const deque& x);
deque(const deque& x, const allocator_type& alloc);
(5)构造一个容器,并直接从x中移动元素,之后x中的元素将被移除
deque(deque&& x);
deque(deque&& x, const allocator_type& alloc);
(6)以相同的顺序构造一个deque容器,其中包含l中每个元素拷贝的副本
deque (initializer_list<value_type> l,const allocator_type& alloc = allocator_type());
2、operator=函数
(1)使用deque列表other对其进行复制拷贝
deque& operator=( const deque& other );
(2)使用deque列表other对其进行移动拷贝,之后other的数据将被清空
deque& operator=( deque&& other );
(3)使用初始化列表对deque进行赋值
deque& operator=( std::initializer_list<T> deque );
3、迭代器
iterator begin(); // 返回list迭代器到第一个元素
const_iterator cbegin(); // 返回list迭代器到第一个元素
iterator end(); // 返回list迭代器到最后一个元素
const_iterator cend(); // 返回list迭代器到最后一个元素
reverse_iterator rbegin(); // 返回list反向迭代器到第一个元素
const_reverse_iterator crbegin();// 返回list反向迭代器到第一个元素
reverse_iterator rend(); // 返回list反向迭代器到最后一个元素
const_reverse_iterator crend(); // 返回list反向迭代器到最后一个元素
4、容量相关
bool empty(); // 判断容器是否为空
size_type size();// 返回容器中当前元素个数
size_type max_size(); //返回容器内可存放的最大元素个数
// 调整容器大小,使其只包含其前n个元素,若n超过size,则使用默认值初始化。
void resize (size_type n);
// 调整容器大小,使其只包含其前n个元素,若n超过size,则使用val初始化。
void resize (size_type n, const value_type& val);
5、元素访问
reference operator[] (size_type n);// 返回对容器中位置n处元素的引用,若n超出容器的size,该场景是未定义行为
reference at (size_type n);// 返回对容器中位置n处元素的引用,若n超出容器的size,将抛出out_of_range 异常
reference back(); // 返回deque中最后1个元素
reference front(); // 返回deque中第1个元素
6、修改容器
注意:函数调用失败时,会抛出bad_alloc异常
// 将deque的元素使用count个value元素进行复制覆盖
void assign( size_type count, const T& value );
// 将deque的元素使用[first,last)的元素进行复制覆盖
template< class InputIt >
void assign( InputIt first, InputIt last );
// 将deque的元素使用初始化列表里的元素进行复制覆盖
void assign( std::initializer_list<T> ilist );
// 使用参数args就地构造新元素,并将其放入容器起始位置
void emplace_front (Args&&... args);
// 使用参数args就地构造新元素,并将其放入容器末尾位置
void emplace_back (Args&&... args);
// 复制或移动元素val至容器起始位置
void push_front (const value_type& val);
void push_front (value_type&& val);
// 复制或移动元素val至容器末尾位置
void push_back(const value_type& val);
void push_back(value_type&& val);
// 从容器起始位置删除一个元素
void pop_front();
// 从容器末尾位置删除一个元素
void pop_back();
// 通过在position插入一个新元素来扩展容器,这个新元素是使用args作为构造参数就地构造的。
iterator emplace (const_iterator position, Args&&... args);
// 在position位置插入元素val
iterator insert (const_iterator position, value_type&& val);
iterator insert (const_iterator position, const value_type& val);
// 在position位置插入n个元素val
iterator insert (const_iterator position, size_type n, const value_type& val);
// 在position位置插入元素[first,last)
iterator insert (const_iterator position, InputIterator first, InputIterator last);
// 在position位置插入一个initializer_list对象
iterator insert (const_iterator position, initializer_list<value_type> il);
// 从deque容器中删除单个元素position
iterator erase (const_iterator position);
// 从deque容器中删除一系列元素 [first,last)
iterator erase (const_iterator first, const_iterator last);
// 与deque容器x互换内容,所有迭代器、引用和指针对交换的对象仍然有效。
void swap (deque& x);
// 从deque容器中移除所有元素(已销毁),并保留大小为0的容器。
void clear();