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

本文转载自:VC驿站

https://www.cctry.com/thread-291232-1-1.html

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 的定义:

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

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

4、list 的初始化:
初始化的方法也是有多种,咱们到 http://www.cplusplus.com/reference/list/list/ 这里面来看下,找到其构造函数的链接:http://www.cplusplus.com/reference/list/list/list/
咱们来一一实现一下,具体演示见视频教程!

#include <list>
int main (int argc, char* argv[])
{
  std::list<int> one;                                //定义一个空的、元素类型是 int 的 list 链表
  std::list<int> two(4,100);               //定义一个包含4个元素,每个元素的值都是100的 list 链表
  std::list<int> three(two.begin(),two.end());  //使用 two 这个对象的迭代器,从开始到结束的所有元素来初始化当前对象
  std::list<int> four(three);                       // 使用 three 这个对象来初始化当前对象

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

  return 0;
}


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

第48课视频教程下载地址:

https://www.cctry.com/thread-291232-1-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值