deque&list容器

**

deque&list容器

**
vector,deque,list,array都是序列式容器。

序列式容器:

1.序列式容器的元素按严格线性排列
2.可按顺序访问它们的位置
3.只有一个前驱和后继

deque容器属性:

序列式容器,动态数组
双端队列
deque的底层实现是一个链式数组
初始化:

    deque<int> dq;
    deque<int> dq2(10);
    deque<int> dq3(10,6);
    deque<int> dq4={1,2,3,4,5,6,7,8,9,10,};

deque与vector一样可以有效的进行尾部数据的的增加和删除,但是deque另外增加了可以高效的在头部数据的增加与删除。

    deque<int> dq4={1,2,3,4,5,6,7,8,9,10,};
    dq4.push_front(3);//在头部插入数据3;
    dq4.pop_front();//删除头部第一个元素;

和vector相比,由于deque的底层是由一些不连续的数组内存之间组成的,所以没有指针内存这么一说;

//deque容器没有下列的功能
 void capcity()=delete; //不能获取内存空间 
 void reserve()=delete; //不能改变空间大小 
 void shrink_to_fit()=delete; //不能缩减空间大小 
 //无法将数据给C语言函数使用 //没有固定的数组指针 
 void data();

deque的特点

1.deque是双端队列数据结构,可以在队尾队头高效的增加或者删减数据,这是比vector有优势的地方。
2.deque内部采用分段连续的内存空间来存储元素,在插入新元素的时候可以随机重新增加一段新的空间并连接起来,因此虽然提供了随机访问操作,但访问速度相比之下要比vector要慢。
3.deque并没有data函数,因为deque的元素并不存放在数组中,不能兼容c语言。
4.deque没有固定的内存空间,固不提供capacity和reserve操作。

迭代器相关的函数

void begin(); // 将迭代器返回到开头(增长方向:begin -> end) 
void end(); // 将迭代器返回到结尾 
void rbegin(); // 返回反向迭代器以反向开始(增长方向:rbegin -> rend)
void rend(); //将反向迭代器返回到反向结束 
void cbegin() //将const_iterator返回到开头 // *与begin类似,区别在于begin指向的值可以改变,cbegin指向的值不可改变* 
void cend() //将const_iterator返回到开头末尾 void crbegin() //返回const_reverse_iterator以反向开始 
void crend() //将const_reverse_iterator返回到反向结束 
void swap() // 交换两个容器的内容 
void emplace() // 在迭代器位置插入元素 
void emplace_front() // 在首部添加一个元素

练习一下迭代器的使用:

deque<int>::iterator iter =dq.begin();
    for(auto i=dq.begin();i!=dq.end();i++)//deque的迭代器不能用<>符号,只能用=,!=;
    {
        cout<<*i<<" ";
    }
    cout<<endl;

   //反向迭代器
    deque<int>::reverse_iterator riter=dq.rbegin();
    for(auto i=dq.rbegin();i<dq.rend();i++)
    {
        cout<<*i<<" ";
    }
      cout<<endl;
   //常量迭代器
    deque<int>::const_iterator citer=dq.cbegin();
    for(auto i=dq.cbegin();i<dq.cend();i++)
    {
        cout<<*i<<" ";
        
    }
    cout<<endl;
    //常量反向迭代器
    deque<int>::const_reverse_iterator criter=dq.crbegin();
    for(auto i=crbegin();i<crend();i++)
    {
        cout<<*i<<" ";
    }
    cout<<endl;
    

list

容器属性

1.list是一个双向链表
2.序列式容器
3.list所占空间比较大。
初始化方式和dequ,vector一样。

特点

list和deque的元素在内存的组织方式不同,list以链表的方式保存。
list也可以在头部和尾部插入元素。
list可以高效的在中间插入元素而不需要移动元素。
list独有函数remove()可以移除和参数一致的元素。
list删除数据的时候会马上回收。
list在多线程的时候会比较安全。

相比vector新增的函数:

void push_front(); //从头部插入数据 
void pop_front(); //从尾部插入数据 
void push_back(); //从头部插入数据 
void pop_back(); //从尾部插入数据 
void insert(); //高效插入数据(多线程环境中相对比较安全) 
void erase(); //高效的删除数据,内存会马上释放掉 
void remove(); //删除元素值 
void remove_if(); //通过特定条件删除数据 
void unique(); //删除连续重复的数值 
void sort(); //调用list内部的排序算法
void merge(); //归并两个有序链表

没有 at() 不能进行内部的随机访问,即不支持 [] 操作符和 at()

vector list deque之间的转换

    vector<int> vr={1,2,3,4,5,6,7,8,9,10};
    deque<int>  de(vr.begin(),vr.end());
    list<int>  li(vr.begin(),vr.end());

总结

1.三个容器的特点,缺点,底层。
2.三个容器的差异,同上
3.几种迭代器的使用。
4,容器之间的转换。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值