STL教程(五): 序列容器--deque

一、deque介绍

template < class T, class Alloc = allocator<T> > 
class deque;

和 vector 容器采用连续的线性空间不同,deque 容器存储数据的空间是由一段一段等长的连续空间构成,各段空间之间并不一定是连续的,可以位于在内存的不同区域。

为了管理这些连续空间,deque 容器用数组(数组名假设为 dequeName)存储着各个连续空间的首地址。也就是说,dequeName 数组中存储的都是指针,指向那些真正用来存储数据的各个连续空间,这也就意味着对std::deque的索引访问必须执行两次指针引用(vector仅需要执行一次):

deque容器的底层存储机制

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();
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值