本文转载自: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,尽量提高程序的性能。
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课视频教程下载地址: