当前位置:   article > 正文

C++(标准库):15---STL容器之(序列式容器deque)

C++(标准库):15---STL容器之(序列式容器deque)

一、序列式容器概述

二、特点

  • 总的来说:双端队列。支持快速随机访问。在头尾插入/删除速度很快
  • deque是非常复杂的数据结构,由多个vector组成,迭代器使用时会在不同的区间跳转
  • 存取元素的时候,deque的内部结构会多出一个间接过程,相比vector操作会慢一些
  • 对内存有限制的系统中,deque比vector可以包含更多元素,因为它不止使用一块内存

什么时候使用deque

  • 需要在两端进行插入删除操作

三、头文件、using声明

  • 头文件:#include <deque>
  • using声明:using std::deque;

四、初始化

  • deque<T>  v1; ==>v1是一个空的deque
  • deque<T> v2(v1); ===>v2是v1的副本,拷贝构造
  • deque<T> v2=v1; ===>同上
  • deque<T> v1(n,val); ===>初始化n个value
  • deque<T> v1(iter1,iter2); ===>用迭代器iter1与iter2所指的区间内元素进行初始化
  • deque<T> v1(n); ===>初始化n个元素,每个元素使用默认值(int为0,string为空...)
  • deque<T> v1{a,b,c...}; ===>用元素a,b,c进行初始化
  • deque<T> v1={a,b,c...}; ===>同上

五、相关操作

1.运算符

  1. d1==d2;//判断d1和d2是否相等
  2. d1!=d2;//判断d1和d2是否相等
  3. >、>=、<、<= //以字典顺序进行比较

2.取值

  • 索引取值:d[0],d[1],d[2]....

六、相关函数

  • 相比于vector:deque不支持capacity()和reserve();。支持push_front();和emplace_front();
  1. d.empty();//判断是否为空,返回布尔值
  2. d.size();//返回容器中的元素个数
  3. d.max_size();//返回容器的容量
  1. d.front();//得到头元素
  2. d.back();//得到尾元素
  3. d.at(int i);//得到下标i处的元素,若下标越界,会抛出异常
  1. d1.swap(d2);//将d1和d2进行交换。容器的成员函数版本
  2. swap(d1,d2);//同上。系统函数版本
  3. d.assign(iter1,iter2);//将容器元素更换为一个迭代器的区间元素
  4. d.assign(n,t);//将容器元素变为n个t元素
  1. d.insert(iter,t);//在迭代器iter处插入t。返回所插位置处的迭代器
  2. d.insert(v.end(),10,t);//在容器v的末尾插入10个元素,每个元素都是t。返回新添加元素的第一个元素的迭代器
  3. d.insert(v.end(),{"a","b"...});//将后面花括号的每个元素插入容器v的尾部。返回新添加元素的第一个元素的迭代器
  4. d.insert(d.begin(),d2.end()-2,d2.end());//将容器d2的最后两个元素插入容器d的头部。返回新添加元素的第一个元素的迭代器
  5. 注意:上面这个用法,后面两个参数不能为自身容器的范围(d.insert(d.begin(),d.end()-2,d.end());是错误的)
  6. //利用insert的返回值,下面代码为一直在d容器的头部插入元素(类似于push_front的功能)
  7. deque<string> d;
  8. auto iter=d.begin();
  9. while(cin>> word)
  10. iter=d.insert(iter,word);//insert函数每回执行完,返回容器的首元素位置
  1. d.push_back(t);//尾部追加元素t
  2. d.push_front(t);//头部追加元素t
  3. d.pop_back();//删除尾元素
  4. d.earse(iter);//删除迭代器iter所指位置处的元素。返回删除位置处后一个元素迭代器
  5. d.erase(iter1,iter2);//删除迭代器iter1与iter2区间内的元素。返回删除最后一个元素的后一个元素迭代器
  6. d.clear();//清空容器,重新初始化容器
  1. d.resize(n);//将容器d的元素变为n个。若n<原始元素个数,删除多于元素。若n>原始元素个数,则用默认初始值初始化容器
  2. d.resize(n,t);//将容器元素变为n个t。与容器原始个数无关
  3. deque<int> d(5,666);
  4. d.resize(3);//d内有3个元素,都是666
  5. d.resize(8);;//d内有8个元素,前5个个是666,后3个都是0(默认)
  6. d.resize(10,666);//d内有10个元素,都是666
  1. //下面的两个函数,是在在内存中创建一个对象,然后添加进相应的位置
  2. d.empalce(iter,args);//在容器d的位置添加创建一个args对象
  3. d.emplace_back(args);//在容器d的尾部添加创建一个args对象
  4. d.emplace_front(args);//在容器d的头部添加创建一个args对象
  5. 例如
  6. class A{
  7. string name;int age;
  8. public:
  9. A(string name, int age);
  10. };
  11. int main()
  12. {
  13. deque<A> d;
  14. d.emplace_back("C语言", 18);//在尾部创建一个元素
  15. d.emplace(v.begin(),"C++",18);//在容器d的头部添加一个元素
  16. }

、容器操作使迭代器、引用、指针失效

1.概念:向容器中添加或者删除元素可能会使容器的迭代器、引用、指针失效。失效的迭代器、引用、指针不再表示任何元素,使用起来非常危险

2.添加元素

  • 如果添加到首尾元素之外的任何位置都会导致迭代器、引用、指针失效
  • 如果在首尾位置添加元素,迭代器会失效,但是引用、指针不会失效

3.删除元素

  • 如果删除的是首尾之外的元素,那么指向被删除元素外的其它元素的迭代器、引用、指针都会失效
  • 如果删除的是首元素,迭代器、引用、指针不受影响
  • 如果删除的是尾元素,尾后迭代器失效,但其它迭代器、指针、引用都不受影响 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/843785
推荐阅读
相关标签
  

闽ICP备14008679号