VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 2536|回复: 65

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

  [复制链接]
51_avatar_middle
online_admins Syc 发表于 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 对象呢?大家课后试试吧!

第48课免费试看,下载地址回复后可见:
游客,如果您要查看本帖隐藏内容请回复

#######################################################
获得所有教学视频、课件、源代码以及售后答疑详见:
《实用C++》:https://www.cctry.com/thread-275996-1-1.html
VC驿站官方客服QQ:8260671

#######################################################




上一篇:《实用C++》第47课 C++容器之动态数组vector②
下一篇:41课作业问题,为什么不能输出正确结果?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

78_avatar_middle
在线会员 csa 发表于 2018-6-20 06:20:43 | 显示全部楼层
感谢分享,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

98_avatar_middle
在线会员 tomok 发表于 2018-6-20 09:14:43 | 显示全部楼层
谢谢提供  跟着学习            

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

85_avatar_middle
在线会员 99099800 发表于 2018-6-21 11:34:50 | 显示全部楼层
谢谢提供,学习一下

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

96_avatar_middle
在线会员 Jer808 发表于 2018-6-23 10:37:21 | 显示全部楼层
顶大神,谢谢大神!!~~

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

19_avatar_middle
online_vip wanzelong 发表于 2018-6-24 00:44:50 | 显示全部楼层
继续学习  

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
在线会员 Sam599 发表于 2018-6-24 19:24:52 | 显示全部楼层
感谢分享,楼主辛苦了!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
在线会员 Sam599 发表于 2018-6-24 19:35:22 | 显示全部楼层
老师,怎么没有密码提供了呢?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
在线会员 Sam599 发表于 2018-6-24 19:37:31 | 显示全部楼层
感谢分享,楼主辛苦了!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
在线会员 Sam599 发表于 2018-6-24 19:40:12 | 显示全部楼层
老师,怎么没有密码提供了呢?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
在线会员 Sam599 发表于 2018-6-24 20:05:46 | 显示全部楼层
老师,怎么没有密码提供了呢?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
在线会员 Sam599 发表于 2018-6-24 20:50:27 | 显示全部楼层
#在这里快速回复# 老师,怎么没有密码提供了呢?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

80_avatar_middle
在线会员 zp521 发表于 2018-6-25 08:39:36 | 显示全部楼层
坚持学习!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

95_avatar_middle
在线会员 zjh2008 发表于 2018-6-25 09:32:31 | 显示全部楼层

感谢分享,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

74_avatar_middle
online_vip08 wssfcn 发表于 2018-6-25 10:16:13 | 显示全部楼层
看看           

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

49_avatar_middle
在线会员 yuanpinq 发表于 2018-6-25 15:22:33 | 显示全部楼层
rhf rhf rhf rhf

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

74_avatar_middle
在线会员 jiaokai123 发表于 2018-6-25 16:59:06 | 显示全部楼层
想看。。··············

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

94_avatar_middle
online_vip08 Mtong 发表于 2018-6-25 21:36:19 | 显示全部楼层
感谢分享,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

82_avatar_middle
在线会员 DetectiveY 发表于 2018-6-26 09:38:40 | 显示全部楼层

感谢分享坚持学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

82_avatar_middle
在线会员 ha521ha 发表于 2018-6-26 10:19:17 | 显示全部楼层

谢谢提供,学习一下

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

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

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

GMT+8, 2018-11-19 22:39

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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