精华内容
下载资源
问答
  • vector和list的区别

    2021-03-06 14:10:18
    vector支持随机访问,可以利用下标精准定位到一个元素上,访问某个元素的时间复杂度是O(1)。   list不支持随机访问,要想访问list中的某个元素只能是从前向后或从后向前依次遍历,时间复杂度是O(N)。 3、插入...

    1、底层结构上
    vector的底层结构是动态数组,在内存中是一段连续的空间。
    list的底层结构是带头节点的双向循环链表,在内存中不是一段连续的空间。
    2、随机访问
    vector支持随机访问,可以利用下标精准定位到一个元素上,访问某个元素的时间复杂度是O(1)。
      list不支持随机访问,要想访问list中的某个元素只能是从前向后或从后向前依次遍历,时间复杂度是O(N)。
    3、插入和删除
    vector任意位置插入和删除的效率低,因为它每插入一个元素(尾插除外),都需要搬移数据,时间复杂度是O(N),而且插入还有可能要增容,这样一来还要开辟新空间,拷贝元素,是旧空间,效率会更低。
      list任意位置插入和删除的效率高,他不需要搬移元素,只需要改变插入或删除位置的前后两个节点的指向即可,时间复杂度为O(1)。
    4、空间利用率
    vector由于底层是动态顺序表,在内存中是一段连续的空间,所以不容易造成内存碎片,空间利用率高,缓存利用率高。
      list的底层节点动态开辟空间,容易造成内存碎片,空间利用率低,缓存利用率低。
    5、迭代器
    vector的迭代器是原生态指针。
      list对原生态指针(节点的指针)进行了封装。
    6、迭代器失效
    vector在插入元素时的时候,要重新给所有的迭代器赋值,因为插入元素有可能导致扩容,只是原来的迭代器失效,删除元素时当前迭代器同样需要重新赋值,否则会失效。
      list在插入元素的时候不会导致迭代器实现,删除元素的时候指挥导致当前迭代器失效,其他的迭代器不会受到影响。
    7、使用场景
    vector适合需要高效率存储,需要随机访问,并且不管行插入和删除效率的场景。
      list适合有大量的插入和删除操作,并且不关心随机访问的场景

    展开全文
  •  在学习stl时候,总是有同学分不清楚Vector和List的使用,在这里我总结一下它们的区别和使用方法。 一、底层结构  vector底层结构是动态顺序表,在内存中是一段连续空间。  list底层结构是带头节点双向...

     在学习stl的时候,总是有同学分不清楚Vector和List的使用,在这里我总结一下它们的区别和使用方法。

    一、底层结构

    vector的底层结构是动态顺序表,在内存中是一段连续的空间。
    list的底层结构是带头节点的双向循环链表,在内存中不是一段连续的空间。

    二、支持随机访问

    vector支持随机访问,可以利用下标精准定位到一个元素上,访问某个元素的时间复杂度是O(1)。
    list不支持随机访问,要想访问list中的某个元素只能是从前向后或从后向前依次遍历,时间复杂度是O(N)。

    三、插入和删除的区别

    vector任意位置插入和删除的效率低,因为它每插入一个元素(尾插除外),都需要搬移数据,时间复杂度是O(N),而且插入还有可能要增容,这样一来还要开辟新空间,拷贝元素,是旧空间,效率会更低。
    list任意位置插入和删除的效率高,他不需要搬移元素,只需要改变插入或删除位置的前后两个节点的指向即可,时间复杂度为O(1)。

    四、空间利用率

    vector由于底层是动态顺序表,在内存中是一段连续的空间,所以不容易造成内存碎片,空寂爱你利用率高,缓存利用率高。
    list的底层节点动态开辟空间,小姐点容易造成内存碎片,空间利用率低,缓存利用率低。

    五、迭代器和失效问题

      vector的迭代器是原生态指针。
      list对原生态指针(节点的指针)进行了封装。
    迭代器失效问题:
      vector在插入元素时的时候,要重新给所有的迭代器赋值,因为插入元素有可能导致扩容,只是原来的迭代器失效,删除元素时当前迭代器同样需要重新赋值,否则会失效。
      list在插入元素的时候不会导致迭代器实现,删除元素的时候指挥导致当前迭代器失效,其他的迭代器不会受到影响。

    六、使用场景

      vector适合需要高效率存储,需要随机访问,并且不管行插入和删除效率的场景。
      list适合有大量的插入和删除操作,并且不关心随机访问的场景

    展开全文
  • list vector 区别

    2020-06-03 11:29:34
      vector支持随机访问,可以利用下标精准定位到一个元素上,访问某个元素的时间复杂度是O(1)。   list不支持随机访问,要想访问list中的某个元素只能是从前向后或从后向前依次遍历,时间复杂度是O(N)。 插入...

    底层结构
      vector的底层结构是动态顺序表,在内存中是一段连续的空间。
      list的底层结构是带头节点的双向循环链表,在内存中不是一段连续的空间。

    随机访问
      vector支持随机访问,可以利用下标精准定位到一个元素上,访问某个元素的时间复杂度是O(1)。
      list不支持随机访问,要想访问list中的某个元素只能是从前向后或从后向前依次遍历,时间复杂度是O(N)。

    插入和删除
      vector任意位置插入和删除的效率低,因为它每插入一个元素(尾插除外),都需要搬移数据,时间复杂度是O(N),而且插入还有可能要增容,这样一来还要开辟新空间,拷贝元素,是旧空间,效率会更低。
      list任意位置插入和删除的效率高,他不需要搬移元素,只需要改变插入或删除位置的前后两个节点的指向即可,时间复杂度为O(1)。

    空间利用率
      vector由于底层是动态顺序表,在内存中是一段连续的空间,所以不容易造成内存碎片,空寂爱你利用率高,缓存利用率高。
      list的底层节点动态开辟空间,小姐点容易造成内存碎片,空间利用率低,缓存利用率低。

    迭代器
      vector的迭代器是原生态指针。
      list对原生态指针(节点的指针)进行了封装。

    迭代器失效
      vector在插入元素时的时候,要重新给所有的迭代器赋值,因为插入元素有可能导致扩容,只是原来的迭代器失效,删除元素时当前迭代器同样需要重新赋值,否则会失效。
      list在插入元素的时候不会导致迭代器实现,删除元素的时候指挥导致当前迭代器失效,其他的迭代器不会受到影响。

    使用场景
      vector适合需要高效率存储,需要随机访问,并且不管行插入和删除效率的场景。
      list适合有大量的插入和删除操作,并且不关心随机访问的场景
     

    展开全文
  • 在STL中基本容器有: string、vectorlist、deque、set、mapset map都是无序保存元素,只能通过它提供接口对里面元素进行访问set:集合, 用来判断某一个元素是不是在一个组里面,使用比较少map:映射,相当于...
    在STL中基本容器有: string、vector、list、deque、set、map

    set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问

    set:集合,
    用来判断某一个元素是不是在一个组里面,使用的比较少
    map:映射,相当于字典,把一个值映射成另一个值,如果想创建字典的话使用它好了
    底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错,
    只是每次插入值的时候,会重新构成底层的平衡二叉树,效率有一定影响.

    string、vector、list、deque、set 是有序容器

    1.string

    string 是basic_string<char> 的实现,在内存中是连续存放的.为了提高效率,都会有保留内存,如string s=
    "abcd",这时s使用的空间可能就是255,
    当string再次往s里面添加内容时不会再次分配内存.直到内容>255时才会再次申请内存,因此提高了它的性能.
    当内容>255时,string会先分配一个新内存,然后再把内容复制过去,再复制先前的内容.

    对string的操作,如果是添加到最后时,一般不需要分配内存,所以性能最快;
    如果是对中间或是开始部分操作,如往那里添加元素或是删除元素,或是代替元素,这时需要进行内存复制,性能会降低.

    如果删除元素,string一般不会释放它已经分配的内存,为了是下次使用时可以更高效.

    由于string会有预保留内存,所以如果大量使用的话,会有内存浪费,这点需要考虑.还有就是删除元素时不释放过多的内存,这也要考虑.

    string中内存是在堆中分配的,所以串的长度可以很大,而char[]是在栈中分配的,长度受到可使用的最大栈长度限制.

    如果对知道要使用的字符串的最大长度,那么可以使用普通的char[],实现而不必使用string.
    string用在串长度不可知的情况或是变化很大的情况.

    如果string已经经历了多次添加删除,现在的尺寸比最大的尺寸要小很多,想减少string使用的大小,可以使用:
    string s =
    "abcdefg";
    string y(s); // 因为再次分配内存时,y只会分配与s中内容大一点的内存,所以浪费不会很大
    s.swap(y);
    // 减少s使用的内存

    如果内存够多的话就不用考虑这个了

    capacity是查看现在使用内存的函数
    大家可以试试看string分配一个一串后的capacity返回值,还有其它操作后的返回值

    2.vector

    vector就是动态数组.它也是在堆中分配内存,元素连续存放,有保留内存,如果减少大小后内存也不会释放.如果新值>当前大小时才会再分配内存.

    它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。

    对最后元素操作最快(在后面添加删除最快 ),
    此时一般不需要移动内存,只有保留内存不够时才需要
    对中间和开始处进行添加删除元素操作需要移动内存,如果你的元素是结构或是类,那么移动的同时还会进行构造和析构操作,所以性能不高
    (最好将结构或类的指针放入vector中,而不是结构或类本身,这样可以避免移动时的构造与析构)。
    访问方面,对任何元素的访问都是O(1),也就是是常数的,所以vector常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作.

    相比较可以看到vector的属性与string差不多,同样可以使用capacity看当前保留的内存,使用swap来减少它使用的内存.

    总结
    需要经常随机访问请用vector

    3.list

    list就是双向链表,元素也是在堆中存放,每个元素都是放在一块内存中,它的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。

    list没有空间预留习惯,所以每分配一个元素都会从内存中分配,每删除一个元素都会释放它占用的内存.

    list在哪里添加删除元素性能都很高,不需要移动内存,当然也不需要对每个元素都进行构造与析构了,所以常用来做随机操作容器.
    但是访问list里面的元素时就开始和最后访问最快
    访问其它元素都是O(n)
    ,所以如果需要经常随机访问的话,还是使用其它的好

    总结
    如果你喜欢经常添加删除大对象的话,那么请使用list
    要保存的对象不大,构造与析构操作不复杂,那么可以使用vector代替
    list<指针>完全是性能最低的做法,这种情况下还是使用vector<指针>好,因为指针没有构造与析构,也不占用很大内存

    4.deque

    deque是一个双端队列(double-ended
    queue),也是在堆中保存内容的.它的保存形式如下:
    [堆1]
    ...
    [堆2]
    ...
    [堆3]

    每个堆保存好几个元素,然后堆和堆之间有指针指向,看起来像是list和vector的结合品,不过确实也是如此
    deque可以让你在前面快速地添加删除元素,或是在后面快速地添加删除元素,然后还可以有比较高的随机访问速度
    它支持[]操作符,也就是支持随即存取,可以让你在前面快速地添加删除元素,或是在后面快速地添加删除元素,然后还可以有比较高的随机访问速度,和vector的效率相差无几,它支持在两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率也差不多。
    在标准库中vector和deque提供几乎相同的接口,在结构上它们的区别主要在于这两种容器在组织内存上不一样,deque是按页或块来分配存储器的,每页包含固定数目的元素.相反vector分配一段连续的内存,vector只是在序列的尾段插入元素时才有效率,而deque的分页组织方式即使在容器的前端也可以提供常数时间的insert和erase操作,而且在体积增长方面也比vector更具有效率

    总结:
    vector是可以快速地在最后添加删除元素,并可以快速地访问任意元素
    list是可以快速地在所有地方添加删除元素,但是只能快速地访问最开始与最后的元素
    deque在开始和最后添加元素都一样快,并提供了随机访问方法,像vector一样使用[]访问任意元素,但是随机访问速度比不上vector快,因为它要内部处理堆跳转
    deque也有保留空间.另外,由于deque不要求连续空间,所以可以保存的元素比vector更大,这点也要注意一下.还有就是在前面和后面添加元素时都不需要移动其它块的元素,所以性能也很高。

    因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面
    的原则:
    1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
    2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
    3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
    展开全文
  • 在STL中基本容器有: string、vectorlist、deque、set、mapset map都是无序保存元素,只能通过它提供接口对里面元素进行访问set:集合, 用来判断某一个元素是不是在一个组里面,使用比较少 map:映射,相当于...
  • vector list map 的区别

    2011-11-21 10:36:33
    vector是序列容器,内存分配时占用连续空间,因为采用是随机迭代器,所以得到某一位置值非常快 ...map底层采用是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错, 只是每次插入
  • vector list map的区别

    2009-12-20 01:32:00
    vector是序列容器,内存分配时占用连续空间,因为采用是随机迭代器,所以得到某一位置值非常快 但是插入删除比较慢,因为涉及到大块内存赋值粘贴. list也是容器,但是内存分配是零散,采用是双向迭代器,得到...
  • 在STL中基本容器有: string、vectorlist、deque、set、map set map都是无序保存元素,只能通过它提供接口对里面元素进行访问 ...底层采用是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来
  • 在STL中基本容器有: vectorlist、deque、set、map set map都是无序保存元素,只能通过它提供接口对里面元素进行访问 ...底层采用是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也
  • 在STL中基本容器有: string、vectorlist、deque、set、map set map都是无序保存元素,只能通过它提供接口对里面元素进行访问 ...底层采用是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来
  • 在STL中基本容器有: vectorlist、deque、set、map set map都是无序保存元素,只能通过它提供接口对里面元素进行...底层采用是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错,
  • set map都是无序保存元素,只能通过它提供接口对里面元素进行...底层采用是树型结构,多数使用平衡二叉树(要求对于每一个节点来说,它左右子树高度之差不能超过1)实现,查找某一值是常数时间,遍历起来效
  • 集合, 用来判断某一个元素是不是在一个组里面,使用比较少map:映射,相当于字典,把一个值映射成另一个值,如果想创建字典话使用它好了底层采用是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来...
  • vector和list区别 从底层实现来说,vector是通过数组实现,存储空间上是一段连续存储空间;list是通过双向链表实现,把不连续内存块通过链表方式连接在一起。 从插入删除时间复杂度来说,vector是随机...
  • 在STL中基本容器有: vectorlist、deque、set、map set map都是无序保存元素,只能通过它提供接口对里面元素进行...底层采用是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错
  • 在STL中基本容器有: vectorlist、deque、set、map set map都是无序保存元素,只能通过它提供接口对里面元素进行访问 ...底层采用是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也
  • list(双向链表),除了第一个最后一个元素外,每个元素都与前后的元素相连接,这意味着可以双向遍历链表,list和vector之间关键区别在于,list在链表中任一位置进行插入删除的时间都是固定的(vector模版提供了...
  • 【C++】list的使用方法

    2021-02-25 07:54:39
    list和vector之间关键的区别在于,list在链表中的任一位置进行插入删除的时间是固定的(vector模板提供了除结尾处外的插入删除,在结尾处,它提供了固定时间的插入删除)。因此vector强调的是通过随机访问进行...
  • 顺序容器之list

    2016-10-21 11:31:09
    ---- list和vector之间的区别和联系: --1)list中任一位置进行插入删除的时间都是固定的; vector在结尾处有固定的插入删除时间,结尾处之外插入删除的时间是线性的。 --2)vector强调的是进行快速随机...
  • 【C++ STL】List

    2019-10-03 13:47:45
     list内部结构和vector或deque截然不同,所以与他们的区别:  list不支持随机存取,需要存取某个元素,需要遍历之前所有元素,是很缓慢行为。  任何位置上(不止是两端)安插删除元素都非常快,始终都是...
  • list要点

    2020-11-17 15:15:12
      list本质是一个双向链表,和vector存在明显区别: 不支持随机存取,也就是说不支持索引获取,如果要获取某个元素,必须遍历到该元素,因此list没有[]重载,也没有at()函数; 任何位置安插删除元素都很快,始终...
  • 【stl学习笔记】list

    2014-07-26 19:22:00
    vector、deque的区别: 1.list不支持随机存取,在list中随机遍历任意元素,是很缓慢行为 2.任何位置上执行元素安插移除都非常快,始终是常数时间内完成,因为无须移动任何其他元素 3.安插删除动作不会...
  • STL高频面试题

    千次阅读 2016-02-21 14:50:36
    2.vector和list的区别vector和数组类似,拥有连续内存空间,支持随机存取,在中间进行元素插入和删除操作时间复杂度是O(n)list是由双向链表实现,只能通过数组指针来进行数据访问,遍历中间元素,时间的...
  • Java面试题三–集合...Vector和List一样,也是通过数组实现,不过Vector支持线程同步,也就是说一个时间只有一个线程可以访问Vector,这样就可以避免多线程而引发不一致性,但是实现同步也需要一些代价,会牺...
  •  Collection是集合类上级接口,继承与他接口主要有Set 和List. Collections是针对集合类一个帮助类,他提供一系列静态方法实现对各种集合搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符...
  •  Collection是集合类上级接口,继承与他接口主要有Set 和List. Collections是针对集合类一个帮助类,他提供一系列静态方法实现对各种集合搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符...

空空如也

空空如也

1 2 3
收藏数 46
精华内容 18
关键字:

vector和list遍历的时间区别