当前位置: 首页 > article >正文

C++学习笔记——C++ deque和vector的区别

C++中的std::deque(双端队列)和std::vector(向量)是两种不同的容器类型,它们有以下区别:

  • 内部实现方式不同:std::deque使用了一种双端队列的数据结构,它由多个块(chunks)组成,每个块内部存储一部分元素。而std::vector则使用了连续的内存块来存储元素。

  • 随机访问性能不同:由于std::vector的元素在内存中是连续存储的,因此它支持高效的随机访问,可以通过索引直接访问任意位置的元素。而std::deque虽然也支持随机访问,但由于元素分布在多个块中,访问不同位置的元素可能需要更多的指针操作,因此相对于std::vector,其随机访问的性能稍差一些。

  • 插入和删除操作性能不同:std::deque在两端进行插入和删除操作的性能较好,因为它可以在常数时间内在两端进行操作。而std::vector在尾部进行插入和删除操作的性能也很好,但在中间或头部进行插入和删除操作时,需要移动后续元素,因此性能较差。

  • 内存管理方式不同:std::deque相对于std::vector具有更高的内存开销,因为它需要为每个块分配额外的内存空间。而std::vector则在内存中分配一块连续的内存来存储元素,可以更有效地利用内存。

综上所述,选择使用std::deque还是std::vector取决于具体的使用场景和需求。如果需要频繁在两端进行插入和删除操作,或者不需要频繁的随机访问,std::deque可能是一个更好的选择。如果需要高效的随机访问和在尾部进行插入和删除操作,std::vector可能更适合。

deque示例代码

#include <iostream>
#include <deque>

int main()
{
  std::deque<int> myDeque;

  // 在尾部插入元素
  myDeque.push_back(10);
  myDeque.push_back(20);
  myDeque.push_back(30);
  std::cout << "在尾部插入元素 双端队列中的元素:";
  for (size_t i = 0; i < myDeque.size(); i++)
  {
    std::cout << myDeque[i] << " ";
  }
  std::cout << std::endl;
  // 在头部插入元素
  myDeque.push_front(5);
  myDeque.push_front(15);

  // 使用索引访问元素
  std::cout << "在头部插入元素 双端队列中的元素:";
  for (size_t i = 0; i < myDeque.size(); i++)
  {
    std::cout << myDeque[i] << " ";
  }
  std::cout << std::endl;

  // 从尾部删除元素
  myDeque.pop_back();
  std::cout << "从尾部删除元素后 双端队列中的元素:";
  for (size_t i = 0; i < myDeque.size(); i++)
  {
    std::cout << myDeque[i] << " ";
  }
  std::cout << std::endl;
  // 从头部删除元素
  myDeque.pop_front();
  std::cout << "从头部删除元素后 双端队列中的元素:";
  for (size_t i = 0; i < myDeque.size(); i++)
  {
    std::cout << myDeque[i] << " ";
  }
  std::cout << std::endl;
  // 使用迭代器访问元素
  std::cout << "删除元素后的双端队列中的元素:";
  for (auto it = myDeque.begin(); it != myDeque.end(); ++it)
  {
    std::cout << *it << " ";
  }
  std::cout << std::endl;
  // 删除特定index的数据,比如第三个的
  myDeque.erase(myDeque.begin() + 3-1);
  std::cout << "删除特定index的数据,比如第三个的 双端队列中的元素:";
  for (size_t i = 0; i < myDeque.size(); i++)
  {
    std::cout << myDeque[i] << " ";
  }
  std::cout << std::endl;
  return 0;
}

在这里插入图片描述

vector示例代码

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVector;

    // 在尾部插入元素
    myVector.push_back(10);
    myVector.push_back(20);
    myVector.push_back(30);

    // 使用索引访问元素
    std::cout << "向量中的元素:";
    for (size_t i = 0; i < myVector.size(); i++) {
        std::cout << myVector[i] << " ";
    }
    std::cout << std::endl;

    // 从尾部删除元素
    myVector.pop_back();

    // 使用迭代器访问元素
    std::cout << "删除元素后的向量中的元素:";
    for (auto it = myVector.begin(); it != myVector.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}


http://www.kler.cn/a/136062.html

相关文章:

  • 呼入机器人:24小时客户服务的未来趋势
  • 【1.排序】
  • 猫咪睡眠:萌态背后的奥秘与启示
  • 猫头虎分享:读孙凝晖院士《人工智能与智能计算的发展》有感
  • 胡九道:经典传承(贵宾酒)
  • 二进制分析的新兴趋势:塑造安全的移动应用
  • Using Set Processing Effectively 有效地使用集合处理
  • CTF-PWN-小tips
  • 【2023云栖】陈守元:阿里云开源大数据产品年度发布
  • ​LeetCode解法汇总2300. 咒语和药水的成功对数
  • kubernetes v1.24.7 + docker
  • Map 和 WeakMap:JavaScript 中的键值对集合
  • EI论文程序:Adaboost-BP神经网络的回归预测算法,可作为深度学习对比预测模型,丰富实验内容,自带数据集,直接运行!
  • 数据库管理工具,你可以用Navicat,但我选DBeaver!
  • vue3 setup展示数据
  • Unity 场景烘培 ——unity Post-Processing后处理1(四)
  • ClickHouse的 MaterializeMySQL引擎
  • Linux进程通信——IPC、管道、FIFO的引入
  • 电容的耐压值是什么意思呢?
  • Midjourney绘画提示词Prompt参考学习教程
  • Mysql-复合查询
  • RuntimeError: PyPI no longer supports ‘pip search‘ (or XML-RPC search).
  • 04.webpack中css的压缩和抽离
  • ClickHouse 物化视图
  • 【mediasoup】TransportCongestionControlClient 1: 代码走读
  • Vue 2.0的源码构建