C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 数据结构与算法

    • 线性表

      • 线性表 - 数组
      • 线性表 - 链表
      • 线性表 - 哈希表
      • 线性表 - 栈
      • 线性表 - 队列
    • 树

      • 树 - 概述
      • 树 - 二叉搜索树(BST)
      • 树 - 平衡二叉树(AVL)
      • 树 - 红黑树(R-B Tree)
      • 树 - 前缀树(Trie Tree)
    • 图

      • 图 - 概述
      • 图 - 遍历(BFS & DFS)
  • 计算机网络

    • 计算机网络 - 物理层
    • 计算机网络 - 数据链路层
    • 计算机网络 - 网络层
    • 计算机网络 - 运输层
    • 计算机网络 - 应用层
  • 操作系统

    • 操作系统 - 概述
    • 操作系统 - 进程与线程
    • 操作系统 - 同步方式
    • 操作系统 - 死锁
  • 计算机组成

    • 计算机组成 - 概述

线性表 - 数组

数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间。

  • 但正因为连续存储,内存空间必须一次性分配够,所以说数组如果要扩容, 要重新分配一块更大的空间,再把数据全部复制过去,时间复杂度 O(N)。
  • 数组中间进行插入或删除,每次必须搬移后面的所有数据以保持连续,时间复杂度 O(N)。
  • 相同点
  • 不同点

C++ 数组 array 和vector 间的联系和区别

相同点

  1. 都和数组类似,都可以使用标准数组的表示方法来访问每个元素;array和vector都针对下标运算符[]进行了重载
  2. 三者的存储都是使用的连续内存,都可以进行随机访问;在array和vector的底层存储结构均使用数组。

不同点

技术数组arrayvector
容量定长容量,定义后的空间是固定的,不能进行改变定长容量,定义后的空间是固定的,不能进行改变变长容器,提供了可以动态插入和删除元素的机制,可以根据数据的 插入删除重新构建容器容量(1.5-2倍),即可以进行再加或减。
元素数量定义的时候必须定义数组的元素个数定义的时候必须定义数组的元素个数不需要预先定义数量
数据访问只能通过下标访问,更容易引发访问错误提供了更好的数据访问机制,即可以使用front()和back()以及at()(at()可以避免a[-1]访问越界的问题)访问方式,访问更加安全提供了更好的数据访问机制,即可以使用front()和back()以及at()(at()可以避免a[-1]访问越界的问题)访问方式,访问更加安全
内容交换只能通过遍历的方式,逐个元素交换的方式使用两个容器对象的内容交换,即swap的机制两个容器对象的内容交换,即swap的机制
容量获取只能通过sizeof()/strlen()以及遍历计数来获取大小和是否为空提供了size()和Empty()的获取机制提供了size()和Empty()的获取机制
遍历机制开箱即用的中台前端/设计解决方案提供了更好的遍历机制,即有正向迭代器和反向迭代器两种提供了更好的遍历机制,即有正向迭代器和反向迭代器两种
安全性不安全的比较安全的(有效的避免越界等问题)比较安全的(有效的避免越界等问题)
内存使用用new[ ]/malloc申请的空间,必须用对应的delete[ ]和free来释放内存在声明周期完成后,会自动地释放其所占用的内存在声明周期完成后,会自动地释放其所占用的内存
元素添加数组一经定义就不允许添加新元素;若需要则要充许分配新的内存空间,再将员数组的元素赋值到新的内存空间。数组一经定义就不允许添加新元素;若需要则要充许分配新的内存空间,再将员数组的元素赋值到新的内存空间。vector有一系列的函数操作,非常方便使用

数组与链表对比

  1. 数组由于是紧凑连续存储,可以随机访问, 通过索引快速找到对应元素,而且相对节约存储空间。

    • 但正因为连续存储, 内存空间必须一次性分配够, 所以说数组如果要扩容, 需要重新分配一块更大的空间,再把数据全部复制过去,时间复杂度 O(N)。

    • 数组中间进行插入或删除,每次必须搬移后面的所有数据以保持连续, 时间复杂度 O(N)。

  2. 链表因为元素不连续, 而是靠指针指向下一个元素的位置, 所以不存在数组的扩容问题。

    • 根据某个元素的前驱和后驱, 操作指针即可删除该元素或插入新元素, 时间复杂度 O(1)。
  • 存储空间不连续,无法根据索引算出对应元素的地址,索引不能随机访问;
  • 每个元素必须存储指向前后元素位置的指针, 会消耗相对更多的储存空间。
Last Updated:
Contributors: klc407073648
Next
线性表 - 链表