• vector,deque,list的区别和使用


    vector:
    表示一段连续的内存区域,每个元素被顺序存储在这段内存中,
    对vector的随机访问效率很高,但对非末尾元素的插入和删除则效率非常低。

    deque:
    也表示N段连续的内存区域组成,但与vector不同的是它支持高效地在其首部插入和删除元素,
    它通过两级数组结构来实现,一级表示实际的容器,第二级指向容器的首和尾

    list:
    表示非连续的内存区域并通过一对指向首尾元素的指针双向链接起来,
    插入删除效率高,随机访问效率低

    使用:
    它们的使用很相似,
    #include <vector>
    #include <deque>
    #include <list>
    //下面是一段代码:
    std::list<int> a;
    a.push_back(5);//从尾部插入数据
    a.push_front(7);//从头部插入数据
    std::list<int>::iterator p=a.begin();//得到头部数据指针,把iterator 当成指针比较容易理解
    *p=10;//修改头部数据
    int i=*p;//得到数据
    a.pop_front();//释放第一个数据

    注意点
    1.当执行大数据量的调用push_back()的时候,记住要调用vector::reserve()。
    2.如果你计划使用insert(),或者需要pop_front(),那就使用deque。
    3.deque是大块大块地分配内存,每次插入固定数量的数据。vector是就近分配内存(这可能不是一个坏的事情)。
    但我们应该关注是,vector每次增加的内存足够大的时候,在当前的内存不够的情况。deque不需要capacity()和reserve()> 是非常有道理的。
    4.*.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);//内存被清空了
    5.*.deque就不一样了,deque永远不会占用太多冗余的内存,你只需要把它resize()到一个你希望的大小,它会自动释放掉那些被多余占用的内存
    6.vector还有一个不好的地方,当你往一个vector里添加一个成员的时候,所有指向这个vector的原来成员的指针就不能保证有效了,
    因为 vector会re-alloc内存.而deque不会,无论从前面还是后面添加新成员,旧的成员都不会移动位置,这一点有时候很有用

  • 相关阅读:
    java学习之成员内部类
    上海 炉石面试题及解析
    利用RALL机制来事项String类的赋值操作
    关于信号打断正在读取终端的read与select来监视0文件描述符的问题
    ubuntu16.04开机花屏蓝屏解决方案
    gcc 中__thread 关键字的示例代码
    成长、责任和公司的关系
    团队贡献分
    团队如何做决定
    分析app的NABCD
  • 原文地址:https://www.cnblogs.com/jeshy/p/10521225.html
Copyright © 2020-2023  润新知