关于容器函数vector和deque

本文对比分析了STL容器vector和deque的内部结构、内存管理和性能特点。vector拥有连续内存,适合遍历和直接转换为指针访问,但插入删除可能导致指针失效;deque支持快速前端插入删除,内存管理更经济,但不保证内存连续。两者各有优势,选择取决于具体应用场景。
摘要由CSDN通过智能技术生成

  vector是我最早用的stl容器,用得也最顺手,它的结构也是清晰易懂.deque就比较神秘一些,也是我最近才开始研究使用的,帮助上提到它的一个最显著的特点就是可以从容器的前端插入成员,而且效率很高.当时觉得很神奇,不知道是怎么做的.stl的源代码看起来太痛苦了,所以到现在也没准确的了解它的结构.不过后来用的多了, 对它的习性也有了一定的了解,有些地方相对于vector来说其实是很有优势的.下面就把两者对比着说说:
 
     *.先说内部结构.vector就是一块连续的内存,这块连续的内存会随着成员的添加而不断的re-alloc,而且在重分配的时候,分配的内存的大小会 比实际需要的多一些,下次再添加成员时,就可以添加在这些多余的空间里,而不会导致每添加一个成员就需要重分配内存.vector封装的是一块连续的内 存,这是我最喜欢它的地方,因为可以把它的成员直接转换成指针来进行访问,很灵活.
 
     *.deque可以根据一个索引进行随机访问,所以我一度也以为它内部有一块连续的内存,直到有一次我真这么干的时候把程序搞当了.才意识到这个错误.deque内部应该是由很多定长的内存块组成的链表,这是我猜的,因为似乎只有这种结构才能和它的表现相符.
 
     *.往vector,deque里添加数据应该都是很快的吧,毕竟这是这两个容器的卖点.这个我没有具体测过.
 
     *.vector的遍历速度是很快的,应该是到极限了,不管你用iterator来遍历还是用一个递增的下标进行访问,经过编译器的优化都可以有最高的效率.
 
     *.deque的遍历速度也不慢,如果使用iterator来遍历,可以有接近于vector的效率,但如果直接用递增的下标进行遍历,好像编译器无法优化至最高效率,好像慢一倍左右:
      std::deque<int> buf;
      std::deque<int>::iterator it;
      int sum=0;
      for (it=buf.begin();it!=buf.end();it++)  //这样遍历比较快
            sum+=*it;
      for (int i=0;i<buf.size();i++)  //这样遍历比较慢
            sum+=buf[i];
 
     *.vector内部分配的内存是永不释放的,即使你调用clear()也不会,这一点很不好,有误导性.有可能一个vector只在瞬间需要很大的容 量,但大多数时间只需要很小的容量,结果却是长时间的占用了很大的,没有被使用到的内存.vector也没有提供函数来释放它内部的内存,不过有一个简单 的办法,前几天在网上找到的:
     i_math::vector<BYTE>buf;
     buf.resize(100000);//分配了一块至少100000 bytes的内存
     if (TRUE)//清空buf的内存
     {
           i_math::vector<BYTE> t;
           buf.swap(t);//把这块内存交换到一个临时的vector里去
     }
     assert(buf.capacity()==0);//内存被清空了
 
     *.deque就不一样了,deque永远不会占用太多冗余的内存,你只需要把它resize()到一个你希望的大小,它会自动释放掉那些被多余占用的内存
 
     *.vector还有一个不好的地方,当你往一个vector里添加一个成员的时候,所有指向这个vector的原来成员的指针就不能保证有效了,因为 vector会re-alloc内存.而deque不会,无论从前面还是后面添加新成员,旧的成员都不会移动位置,这一点有时候很有用.
 
     所以我觉得deque其实在很多地方都有优势,比起vector,它欠缺的就是内存不连续,使用起来不够灵活,但它对内存使用的更经济,而访问的效率也比 vector慢不了太多,当然,它还能从前面快速插入删除,这是压倒性的优势.总之,deque是在关键时候能帮上忙的那种,平时可能还是vector更 好用一些.
ps:
std::deque是一个高效的双端队列,可以高效地进行插入和删除操作。

以SGI C++ STL为例
deque的基本结构是:有一个map ,map中的元素是一个记录了一个大小为512字节的线性容器。

std::deque的构造方法:
std::deque<int> queInt;//空队列
std::deque<int> queInt(10);//长度为10的队列(其中元素被初始化为该类型的0值)
std::deque<int> queInt(10,5);//长度为10的队列(其中元素被初始化为该类型的5)


std::deque<int> queIntTemp(10,5);//长度为10的队列(其中元素被初始化为该类型的5)
std::deque<int> queInt(queIntTemp);//以queIntTemp初始化queInt

int nArray[5] = {0,1,2,3,4};
std::deque<int> queInt(nArray, nArray + 5);//注意这里是nArray + 5,而不是nArray + 4

插入数据的方法
push_back();//末尾插入
push_front();//前端插入

删除方法
pop_front();
pop_back();
erase();
clear();

 

Deque 成员函数

 

函数

 

描述

 

c.assign(beg,end)

 

c.assign(n,elem)

 

[beg; end) 区间中的数据赋值给 c

 

n

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值