zoukankan      html  css  js  c++  java
  • 9、 vector与list的区别与应用?怎么找某vector或者list的倒数第二个元素

    1) vector数据结构

    vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。因此能高效的进行随机存取,时间 复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复 杂度为o(n)。另外,当数组中内存空间不够时,会重新申请一块内存空间并进行内存拷贝。连续存储结 构:vector是可以实现动态增长的对象数组,支持对数组高效率的访问和在数组尾端的删除和插入操 作,在中间和头部删除和插入相对不易,需要挪动大量的数据。它与数组最大的区别就是vector不需程 序员自己去考虑容量问题,库里面本身已经实现了容量的动态增长,而数组需要程序员手动写入扩容函数进形扩容。

    2) list数据结构

    list是由双向链表实现的,因此内存空间是不连续的。只能通过指针访问数据,所以list的随机存取非常 没有效率,时间复杂度为o(n);但由于链表的特点,能高效地进行插入和删除。非连续存储结构:list是一 个双链表结构,支持对链表的双向遍历。每个节点包括三个信息:元素本身,指向前一个元素的节点 (prev)和指向下一个元素的节点(next)。因此list可以高效率的对数据元素任意位置进行访问和插入 删除等操作。由于涉及对额外指针的维护,所以开销比较大。

    区别:

    vector的随机访问效率高,但在插入和删除时(不包括尾部)需要挪动数据,不易操作。list的访问要遍历整个链表,它的随机访问效率低。但对数据的插入和删除操作等都比较方便,改变指针的指向即可。 list是单向的,vector是双向的。vector中的迭代器在使用后就失效了,而list的迭代器在使用之后还可以继续使用。

    3) int mySize = vec.size();vec.at(mySize -2); list不提供随机访问,所以不能用下标直接访问到某个位置的元素,要访问list里的元素只能遍历,不过 你要是只需要访问list的最后N个元素的话,可以用反向迭代器来遍历

  • 相关阅读:
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    codevs 1501 二叉树最大宽度和高度x
  • 原文地址:https://www.cnblogs.com/crbhf/p/15069271.html
Copyright © 2011-2022 走看看