vector

  class Dog;
// 例 1:
vector<Dog> vec(6); // vec.capacity() == 6, vec.size() == 6,
// 默认构造生成6 Dogs // 例 2:
vector<Dog> vec; // vec.capacity() >= 0, vec.size() == 0
vec.resize(6); // vec.capacity() >= 6, vec.size() == 6,
// 默认构造生成6 Dogs // 例 3:
vector<Dog> vec;
vec.reserve(6); // vec.capacity() >= 6, vec.size() == 0,
// 不调用默认构造 // vector容量指数型增长,用完之后会重新分配,拷贝元素
/*
* 避免重新分配内存的策略:
* 1. 如果所需的最大元素个数已知, reserve(MAX);
* 2. 如果不知道,先reserve尽可能多,等所有元素插入完毕,再将剩余的切除。
*/

deque

/*
* - 没有重新分配
* deque没有reserve()和capacity()
* - 比vector稍慢,因为数据结构比vector复杂,因为不连续定位也有一定的开销,更多的cache miss或page fault
* - 现代编译器往往会把他们放到一起
*/ //固定大小线性增长

如何选择

一般原则

- 经常需要在前面插入的?  -> deque
- 性能重要的? -> vector

详细分析

  1. 元素类型

    • 如果不是很小的类型,那么deque相比vector并不会低效很多
  2. 内存的可用性

    • 大块的连续内存分配是否可能成为问题,内存受限
  3. 数据增长是否不可预期

      vector<int> vec;
    for (int x=0; x<1025; x++)
    vec.push_back(x); // 11 reallocations performed (growth ratio = 2) // workaround: reserve()
  4. 因为增长带来的指针/引用/迭代器失效

      vector<int> vec = {2,3,4,5};
    int* p = &vec[3]
    vec.push_back(6);
    cout << *p << endl; // 未定义的行为 deque<int> deq = {2,3,4,5};
    p = &deq[3];
    deq.push_back(6);
    cout << *p << endl; // OK
    // push_front()也OK
    // deque: 在首尾插入不会使指针失效 // 注:在中间插入删除的话,还是会使指针失效
  5. vector独有的特性: 兼容C

      vector<int> vec = {2,3,4,5}; 
    
      void c_fun(const int* arr, int size);
    
      c_fun(&vec[0], vec.size());
    
      // 对于其他容器,需要先将数据拷贝到vector
    list<int> mylist;
    ...
    vector<int> vec(mylist.gegin(), mylist.end());
    c_fun(&vec[0], vec.size()); // 注: &vector[0]可以当做C的数组使用
    // 一个例外是: vector<bool>
    void cpp_fun(const bool* arr, int size);
    vector<bool> vec = {true, true, false, true};
    cpp_fun(&vec[0], vec.size()); // vector<bool>的每个元素优化为由1bit来表示,可以用vecter<int>或者bitset

总结

  1. 经常push_front() - deque
  2. 高性能 - vector
  3. 不是细小的数据类型 - deque
  4. 内存受限 - deque
  5. 不可预期的增长 - deque
  6. 指针有效性 - deque
  7. C接口 - vector

STL进阶--vector vs deque的更多相关文章

  1. STL容器 vector,list,deque 性能比较

    C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差 ...

  2. C++——STL之vector, list, deque容器对比与常用函数

    STL 三种顺序容器的特性对比: vector 可变数组,内存空间是连续的,容量不会进行缩减.支持高效随机存取,即支持[]和at()操作.尾部插入删除效率高,其他位置插删效率较低: list 双向链表 ...

  3. C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器

    课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...

  4. STL中vector、list、deque和map的区别

    1 vector     向量 相当于一个数组    在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...

  5. 【转】STL中vector、list、deque和map的区别

    1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...

  6. [STL] Implement "vector", ”deque“ and "list"

    vector “可增的”数组 vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似. 不同的地方就是: (1) 数组是静态分配空间,一旦分配了空间的大小,就不可再改变了: (2) v ...

  7. STL之vector,deque学习实例

    ``` #include<iostream> #include<algorithm> #include<ctime> #include<vector> ...

  8. STL学习三:deque容器

    1.Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. deque在接口上和vector非常 ...

  9. vector,list,deque

    stl提供了三个最基本的容器:vector,list,deque. vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由 ...

随机推荐

  1. xdoj-1057(Lucas定理的证明及其模板)

    Lucas定理的证明: 转自百度百科(感觉写的还不错) 首先你需要这个算式:    ,其中f > 0&& f < p,然后 (1 + x) nΞ(1 + x) sp+q Ξ ...

  2. POJ3090 Visible Lattice Points (数论:欧拉函数模板)

    题目链接:传送门 思路: 所有gcd(x, y) = 1的数对都满足题意,然后还有(1, 0) 和 (0, 1). #include <iostream> #include <cst ...

  3. 20155208徐子涵 2016-2017-2 《Java程序设计》第10周学习总结

    #### **教材学习总结**网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴. * ...

  4. 20155208徐子涵 2016-2017-2 《Java程序设计》第6周学习总结

    20155208徐子涵 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 10.1.1 1.Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串 ...

  5. FZU软工第三次作业-原型设计

    目录 00.前言: 01.PSP表格: 02.需求分析--NABCD模型 N-- Need 需求 A-- Approach 做法 B-- Bnefit 好处 C-- Competitors 竞争 D- ...

  6. c++——数据结构

    1.写一个函数PrintN,使得传入一个N,打印从1到N的全部整数 #include<stdio.h> //循环实现 void PrintN(int N){ int i; ;i<=N ...

  7. QuickSort(Java)

    private void quickSort(int[] input, int start, int end) { if (start >= end) return; int index = p ...

  8. 远程登录多用户同时访问Win7系统远程桌面

    https://jingyan.baidu.com/article/ca00d56c384ea0e99febcf45.html 一,远程电脑上新增三个用户名   1 在远程电脑桌面,右击[计算机]图标 ...

  9. redux笔记 进阶

    1 拆分UI组件和容器组件 import React from 'react' const AppUI = (props) =>{ return ( <div className=&quo ...

  10. RequireJS 学习资料收集

    RequireJS 学习资料收集 RequireJS 模块化管理 Javascript 比较优秀. RequireJS 英文官网 https://requirejs.org/ RequireJS 中文 ...