zoukankan      html  css  js  c++  java
  • list类学习

    一、简介

    1.1 介绍

      list是一种序列式容器。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速的。list的实现大概是这样的:list的每个节点有三个域:前驱元素指针域、数据域和后继元素指针域。前驱元素指针域保存了前驱元素的首地址;数据域则是本节点的数据;后继元素指针域则保存了后继元素的首地址。其实,list和循环链表也有相似的地方,即:头节点的前驱元素指针域保存的是链表中尾元素的首地址,list的尾节点的后继元素指针域则保存了头节点的首地址,这样,list实际上就构成了一个双向循环链。由于list元素节点并不要求在一段连续的内存中,显然在list中是不支持快速随机存取的,因此对于迭代器,只能通过“++”或“--”操作将迭代器移动到后继/前驱节点元素处。而不能对迭代器进行+n或-n的操作,这点,是与vector等不同的地方。

    1.2 vector、list以及deque对比

      vector :vector和built-in数组类似,拥有一段连续的内存空间能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当插入较多的元素后,预留内存空间可能不够,需要重新申请一块足够大的内存并把原来的数据拷贝到新的内存空间。这些影响了vector的效率,但是实际上用的最多的还是vector容器,建议大多数时候使用vector效率一般是不错的,此外,vector还会存在空间的浪费。vector的用法解析可以参考本人的另一篇随笔:http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/08/2627666.html

      list:list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。

      deque: deque是一个double-ended queue,它的具体实现是一块主控内存区加多个连续的数据存储区(单独的数据存储区是一块连续的内存),但知道它具有以下两个特点:它支持[]操作符,也就是支持随即存取,并且和vector的效率相差无几,它支持在两端的操作:

    1.3 vector、list以及deque应用

      1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector。
      2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list。
      3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。

    二、函数

     1 assign() 给list赋值 
     2 back() 返回最后一个元素 
     3 begin() 返回指向第一个元素的迭代器 
     4 clear() 删除所有元素 
     5 empty() 如果list是空的则返回true 
     6 end() 返回末尾的迭代器 
     7 erase() 删除一个元素 
     8 front() 返回第一个元素 
     9 get_allocator() 返回list的配置器 
    10 insert() 插入一个元素到list中 
    11 max_size() 返回list能容纳的最大元素数量 
    12 merge() 合并两个list 
    13 pop_back() 删除最后一个元素 
    14 pop_front() 删除第一个元素 
    15 push_back() 在list的末尾添加一个元素 
    16 push_front() 在list的头部添加一个元素 
    17 rbegin() 返回指向第一个元素的逆向迭代器 
    18 remove() 从list删除元素 
    19 remove_if() 按指定条件删除元素 
    20 rend() 指向list末尾的逆向迭代器 
    21 resize() 改变list的大小 
    22 reverse() 把list的元素倒转 
    23 size() 返回list中的元素个数 
    24 sort() 给list排序 
    25 splice() 合并两个list 
    26 swap() 交换两个list 
    27 unique() 删除list中重复的元素

    三、参考文章

    https://blog.csdn.net/whz_zb/article/details/6831817?utm_term=c++list%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-1-6831817&spm=3001.4430

    本文来自博客园,作者:Mr-xxx,转载请注明原文链接:https://www.cnblogs.com/MrLiuZF/p/15170016.html

  • 相关阅读:
    队列学哪个好
    python web 开发
    随笔
    问题集录
    大早晨地,快睡觉了,才想明白多线程代理验证是如何做的
    线程真的挺不错的,但是多了的时候也有点让人头痛
    愁死我了,写个控制台怎么好象在写解释器一样
    我越发地发现,我是在写一个解释器了
    哈哈,真有意思
    我要崩溃了。。。。
  • 原文地址:https://www.cnblogs.com/MrLiuZF/p/15170016.html
Copyright © 2011-2022 走看看