STL快速入门学习教程之list的简单使用

本文是STL快速入门教程,重点讲解了list的特性与使用,包括list与vector的区别、list节点定义、构造函数、成员函数以及元素的添加、删除和大小调整。此外,还提供了代码示例和判断list是否为空的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL快速入门学习教程之list的简单使用

list概述
       list使用一个double link list(双向链表)的形式来存储元素。
       list和vector都是序列式的容器,现在我们来谈谈它们之间的差异,它们之间唯一的区别就是;Vector是以一段连续的内存空间进行存储,list则是以不连续的内存空间进行存储,我们可以很快的联想到线性表的顺序存储结构和链式存储结构,如果你有数据结构的基础知识,我相信你很快就能够理解它们。list以不连续的存储结构进行数据的存储,相比Vector来说,list在插入数据和删除数据时,只需要分配或释放一个元素的内存空间即可,缺点:随机访问比较慢。

1.Vector多以存储基本数据类型,而List多以存储复合数类型,下面我以存储结构体的形式介绍List的用法。
2.这仅仅是作者个人观点,具体使用情况还得考虑具体要求以及环境需求。

list节点
       根据自己需要存储的数据形式定义一个结构体作为存储节点,作者简单的定义一个Mylist_node结构。

struct Mylist_node
{
	int id;
	char *ch;
};

构造函数

  1. list< type> listname;//创建空链表
  2. list< type> listname(5);//创建一个含有默认值都为0的链表
  3. list< type> listname(5,2);//创建含有5个元素且值都为2的链表
  4. list< type> listname(listname1);//建立一个listname1的复制链表
  5. list< type> listname(listname1.begin(),listname1.end());//listname是由listname1的区域元素。

成员函数

listname.begin() //返回指向首元素的迭代器
listname.end() //返回指向尾部元素的迭代器

void print_node(Mylist_node &d)
{
	cout << d.id << " " << d.ch <<endl;
}
void list_node_init()
{
	Mylist_node no = { 1001,"李明" };
	list<Mylist_node> stu(5,no);

	for_each(stu.begin(), stu.end(), print_node);
}

在这里插入图片描述

listname.rbegin()//返回逆向链表的第一个元素,即原链表的最后一个元素。
listname.rend()//返回逆向链表的最后一个元素的下一个元素,即原链表的第一个元素的前一个位置。

元素添加和删除

push_back() //在List的末尾添加一个元素
push_front() //在List的头部添加一个元素
pop_back() //删除最后一个元素
pop_front() //删除第一个元素

完整代码

#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

struct Mylist_node
{
	int id;
	const char *ch;
};

ostream &operator << (ostream &os, Mylist_node & node_li)
{
	os << node_li.id << " " << node_li.ch << endl;
	return os;
}
void print_node(Mylist_node &d)
{
	cout << d.id << " " << d.ch << endl;
}
void list_node_init()
{
	Mylist_node no0 = { 1000,"王翔" };
	Mylist_node no1 = { 1001,"李明" };
	Mylist_node no2 = { 1002,"李四" };
	Mylist_node no3 = { 1003,"王强" };
	Mylist_node no4 = { 1004,"刘刚" };
	Mylist_node no5 = { 1005,"韦晓" };

	list<Mylist_node> stu(1, no1);   //使用构造函数初始化list
									 //使用push_back(),将数据插入list的尾部
									 //下面为插入四个Mylist_node结构的数据
	stu.push_back(no2);
	stu.push_back(no3);
	stu.push_back(no4);
	stu.push_back(no5);
	stu.push_front(no0);  //在list头部添加元素no0
    stu.resize(3);          //设置list大小为3

    cout<<stu.size()<<endl; //显示当前list的大小

    //stu.pop_back();         //删除list最后一个元素
    //stu.pop_front();          //删除list头部元素
	//将List中的元素输出
	for_each(stu.begin(), stu.end(), print_node);

    //判断list是否为空
    //返回0表示不为空,返回1,表示为空
    list<Mylist_node> stu1;

    cout<<stu.empty()<<endl;
    cout<<stu1.empty()<<endl;

	//使用迭代器输出list元素
	list<Mylist_node>::iterator li;
	for (li = stu.begin();li != stu.end();li++)
	{
		cout << *li << endl;
	}
}

int main()
{
	//list<int> li;
	//li.push_back(1);
	//li.push_back(2);
	//li.push_back(3);
	//li.push_back(3);
	//li.push_back(5);

	list_node_init();

	//system("pause");
	return 0;
}

去掉 行:(//stu.pop_back(); //删除list最后一个元素)中的注释,运行结果:
在这里插入图片描述去掉 行:(//stu.pop_front(); //删除list头部元素)中的注释,运行结果:
在这里插入图片描述改变list的大小

listname.resize(3) //设置list大小为3

容器当前大小为3(容器中只含有3个元素):
在这里插入图片描述
判断list是否为空

listname.empty()//判断list是否为空, 返回0表示不为空,返回1,表示list为空。

在这里插入图片描述使用迭代器输出list
在这里插入图片描述关于list还有很多内容,后面将会补充。

版权声明

内容均由作者学习整理提供,未经作者允许不得转载
关于作者更多请转至:网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值