数据结构的理解

数据结构的理解

堆栈:我们可以把堆理解成一个弹夹, 一端固定,另外一端是浮动的,子弹就是数据,数据从栈顶压入栈中,就像子弹被压入弹夹,先进去的子弹肯定是后被击发出去, 所以叫先进后出
空间分配区别:
  • 堆:在程序里,如果使用到了malloc,静态变量,全局变量,函数地址等,这些就是存放在堆中的数据,堆中的数据是在我们程序结束后由系统统一回收

  • 栈:程序中声明的临时变量,函数传参(非地址传递),通常为函数退出后由操作系统销毁

队列(queue):两端浮动,从尾部放入,从头部拿出,比如我们通常地铁高铁行李过安检,那就是一个队列,所以叫先进先出
容器:动态数组(std::vector)
  • 资料:连续存储元素,这意味着不仅可通过迭代器,还能用指向元素的常规指针访问元素。这意味着指向 vector 元素的指针能传递给任何期待指向数组元素的指针的函数。

    vector 的存储是自动管理的,按需扩张收缩。 vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。 vector 所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配。分配的内存总量可用 capacity() 函数查询。可通过调用 shrink_to_fit() 返回额外内存系统。 (C++11 起)

    重分配通常是性能上有开销的操作。若元素数量已知,则 reserve() 函数可用于消除重分配。

  • 个人理解:以上是这里摘抄的,简单的用人话讲,就是先给你一个篮子放东西,如果你放不下啦, 就需要一个更大的篮子,这个换篮子的过程呢就是性能消耗,所以,如果我们对一个无法预知长度上限的数据不要用vector (以上说法只是为了方便理解,不一定准确)

容器:键值对(std::map)
  • 资料:std::map 是有序键值对容器,它的元素的键是唯一的。用比较函数 Compare 排序键。搜索、移除和插入操作拥有对数复杂度。 map 通常实现为红黑树

    在每个标准库使用比较(Compare) 概念的位置,以等价关系检验唯一性。不精确而言,若二个对象 ab 互相比较不小于对方 : !comp(a, b) && !comp(b, a) ,则认为它们等价(非唯一)。

    std::map 满足容器 (Container) 知分配器容器(AllocatorAwareContainer) 关联容器(AssociativeContainer) 可逆容器(ReversibleContainer) 的要求。以上是这里摘抄的

  • 个人理解:有树的概念,上面的话就很好理解,红黑树是自平衡树的一种,概念就是,保证从父节点到叶子节点的搜索路径最短,以下是红黑树图示;按1到8顺序插入,如下图所示

    以上所说的,搜索、移除和插入操作拥有对数复杂度, 代表大量用到这些操作会有性能消耗

容器:固定数组(std::array)
  • 资料:std::array 是封装固定大小数组的容器。

    此容器是一个聚合类型,其语义等同于保有一个 C 风格数组 T[N] 作为其唯一非静态数据成员的结构体。不同于 C 风格数组,它不会自动退化成 T* 。它能作为聚合类型聚合初始化,只要有至多 N 个能转换成 T 的初始化器: std::array<int, 3> a = {1,2,3}; 。

    该结构体结合了 C 风格数组的性能、可访问性与容器的优点,比如可获取大小、支持赋值、随机访问迭代器等。

    std::array 满足容器(Container) 可逆容器(ReversibleContainer)的要求,除了默认构造的 array 是非空的,以及进行交换的复杂度是线性,它满足连续容器(ContiguousContainer)(C++17 起)的要求并部分满足序列容器(SequenceContainer)的要求。

    当其长度为零时 arrayN == 0 )有特殊情况。此时, array.begin() == array.end() ,并拥有某个唯一值。在零长 array 上调用 front() 或 back() 是未定义的。

    亦可将 array 当做拥有 N 个同类型元素的元组。以上是这里摘抄的

  • 个人理解:就是把C里的数组封装成了个类,这个类里有许多常用到的方法,保证性能的同时也保证方法的可易用性,简单的实现就用数组,有很多操作的 交换,删除,排序啥的用array

posted @ 2021-05-15 11:00  做个奇怪的人  阅读(136)  评论(0编辑  收藏  举报