VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 6941|回复: 87

《实用C++》第48课 C++容器之链表list①

  [复制链接]
51_avatar_middle
online_admins 发表于 2018-6-20 00:19:12 | 显示全部楼层 |阅读模式
1、为什么要有list链表,list 和 vector 有什么区别?
有很多网友会说,咱们之前不是讲解过vector了吗?动态的数组,而且数目也可以一直增加,已经够用了吧,以后只要是数目不确定的我就用vector就行了,为什么本节课又出来个list链表呢?他们有什么区别?

实际上他们适用的场合不同,这里面说明下:
①、vector 本身虽然是动态数组,但是归根结底他也是数组,对不对?所以数组最基本的特征他要满足,不然就不能称之为数组,最基本的特征就是内存连续,这个特征对于数组来说有优点也有缺点。优点是因为内存连续,每个元素的大小是确定的,所以,我知道了数组的首地址之后,就可以通过下标索引快速的定位到数组中的任意一个元素,比如第5个元素,那么就 a[4],第234个元素就是 a[233],因为内存连续,所以可以直接通过下标计算出后面的元素相对于首地址的偏移,所以对于数组来说随机的访问数组中的任意一个元素是比较快的。那么缺点呢?就是在插入数据的操作。如果我想在vector的中间插入n个元素,那么为了保持数组固有的内存连续的特性,所以元素插入到中间之后,后面的原有的元素只能大面积的依次向后挪,所以这就造成效率低下。举个例子:数组中原有的元素有:0,1,2,3,4,5,6,7,8,9,如果我想在5的前面插入3个8,那么数组就变成:0,1,2,3,4,8,8,8,5,6,7,8,9,看到了吧,3个8插入进去了,但是后面的5,6,7,8,9要依次往后挪,这就是数组插入时候的效率问题。

②、list 链表呢,本身是链表,所以内存是不连续的,其元素是一个一个的结点在内存中离散的分布。各个结点之间是通过元素内部的指针指过去的,所以对于list来说,如果我想快速的定位到指定的元素,那么他做不到!只能从头到尾的去遍历,通过第1个元素去找第2个元素,通过第2个元素去找第3个元素,以此类推,直到找到你要的元素才行。以上就是list的缺点。优点呢,既然有缺点就应该有优点,优点就是在内部随机的插入元素的时候比较快,因为只需要把插入位置的前后两个节点的指针断开,之后跟新插入的结点连上就可以了,不用大面积的移动其他元素的内存,这就是优点。

③、所以,通过以上两点的说明,大家可以根据自己具体的场合来选择到底是用 vector 还是用 list,尽量提高程序的性能。
《实用C++》第48课 C++容器之链表list①

2、list 的头文件和命名空间:
#include <list> //注意,没有 .h
using namespace std; //在 std 标准命名空间中

3、list 的定义:
  1. list 是动态链表,跟 vector 一样,[b]他也能够适应任何类型[/b]!他是一个类模板,例如:
  2. list<int> list_int; //定义了一个内部元素是int的链表;
  3. list<char> list_char; //定义了一个内部元素是char的链表;
  4. list<CStudent> list_student; //定义了一个内部元素是CStudent的链表;
  5. list<char*> list_pchar; //定义了一个内部元素是char*的链表;
复制代码

怎么样?这个类模板非常方便吧,要什么类型就来什么类型,而且容量大小没有限制!

4、list 的初始化:
初始化的方法也是有多种,咱们到 http://www.cplusplus.com/reference/list/list/ 这里面来看下,找到其构造函数的链接:http://www.cplusplus.com/reference/list/list/list/
咱们来一一实现一下,具体演示见视频教程!
  1. #include <list>
  2. int main (int argc, char* argv[])
  3. {
  4.   std::list<int> one;                                //定义一个空的、元素类型是 int 的 list 链表
  5.   std::list<int> two(4,100);               //定义一个包含4个元素,每个元素的值都是100的 list 链表
  6.   std::list<int> three(two.begin(),two.end());  //使用 two 这个对象的迭代器,从开始到结束的所有元素来初始化当前对象
  7.   std::list<int> four(three);                       // 使用 three 这个对象来初始化当前对象

  8.   int myints[] = {16,2,77,29};
  9.   std::list<int> five (myints, myints + sizeof(myints) / sizeof(int) ); //使用一个普通的 int 数组来初始化当前对象

  10.   return 0;
  11. }
复制代码


5、小作业:
能不能通过 list 的构造函数,实现将一个 vector 对象里面的内容赋值给 list 对象呢?大家课后试试吧!


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教程在线观看地址:
https://www.bilibili.com/video/av38388453/?p=50
MP4高清视频下载地址:链接:https://pan.baidu.com/s/1qRD8nhqC-xUvpI41zrw-uA 提取码:w19h
本节课件下载(回复后可见):
游客,如果您要查看本帖隐藏内容请回复

备注:VIP会员可免费下载本站所有资源(点击查看)
提示:通过购买VC驿站U盘打包(点击查看)也可加入终身Vip会员^_^




上一篇:《实用C++》第47课 C++容器之动态数组vector②
下一篇:《实用C++》第49课 C++容器之链表list②
78_avatar_middle
在线会员 发表于 2018-6-20 06:20:43 | 显示全部楼层
感谢分享,谢谢
98_avatar_middle
在线会员 发表于 2018-6-20 09:14:43 | 显示全部楼层
谢谢提供  跟着学习            
85_avatar_middle
在线会员 发表于 2018-6-21 11:34:50 | 显示全部楼层
谢谢提供,学习一下
96_avatar_middle
在线会员 发表于 2018-6-23 10:37:21 | 显示全部楼层
顶大神,谢谢大神!!~~
19_avatar_middle
online_vip 发表于 2018-6-24 00:44:50 | 显示全部楼层
继续学习  
75_avatar_middle
在线会员 发表于 2018-6-24 19:24:52 | 显示全部楼层
感谢分享,楼主辛苦了!
75_avatar_middle
在线会员 发表于 2018-6-24 19:35:22 | 显示全部楼层
老师,怎么没有密码提供了呢?
75_avatar_middle
在线会员 发表于 2018-6-24 19:37:31 | 显示全部楼层
感谢分享,楼主辛苦了!
75_avatar_middle
在线会员 发表于 2018-6-24 19:40:12 | 显示全部楼层
老师,怎么没有密码提供了呢?
75_avatar_middle
在线会员 发表于 2018-6-24 20:05:46 | 显示全部楼层
老师,怎么没有密码提供了呢?
75_avatar_middle
在线会员 发表于 2018-6-24 20:50:27 | 显示全部楼层
#在这里快速回复# 老师,怎么没有密码提供了呢?
80_avatar_middle
在线会员 发表于 2018-6-25 08:39:36 | 显示全部楼层
坚持学习!
95_avatar_middle
在线会员 发表于 2018-6-25 09:32:31 | 显示全部楼层

感谢分享,谢谢
74_avatar_middle
在线会员 发表于 2018-6-25 10:16:13 | 显示全部楼层
看看           
49_avatar_middle
在线会员 发表于 2018-6-25 15:22:33 | 显示全部楼层
rhf rhf rhf rhf
74_avatar_middle
在线会员 发表于 2018-6-25 16:59:06 | 显示全部楼层
想看。。··············
94_avatar_middle
online_vip 发表于 2018-6-25 21:36:19 | 显示全部楼层
感谢分享,谢谢
82_avatar_middle
在线会员 发表于 2018-6-26 09:38:40 | 显示全部楼层

感谢分享坚持学习
82_avatar_middle
在线会员 发表于 2018-6-26 10:19:17 | 显示全部楼层

谢谢提供,学习一下
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-9-21 07:51

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表