【STL学习笔记】 list 的基本概念和用法

本文详细介绍了C++STL中的链表(list)数据结构,包括其组成、优点与缺点,以及常见的操作方法如构造、赋值、大小调整、插入删除、数据存取、反转和排序。
摘要由CSDN通过智能技术生成

list

list 基本概念

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的,将数据进行链式存储。

链表的组成:链表由一系列结点组成
结点的组成:存储数据元素的数据域,和存储下一个结点地址的指针域

注意:STL中的链表是一个双向循环链表
list 示意图

  • 由于链表的存储方式并不是连续的内存空间,因此链表 list 中的迭代器只支持前移和后移,属于双向迭代器
  • list 有一个重要的性质,插入操作和删除操作都不会造成原有 list 迭代器的失效,这在vector是不成立的。

list的优点:

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作方便,修改指针即可,不需要移动大量元素

list的缺点:

  • 链表灵活,但是 空间(指针域)和 时间(遍历)额外耗费较大

list 构造函数

list<T> lst;            //list采用采用模板类实现,对象的默认构造形式:
list(beg,end);          //构造函数将[beg, end)区间中的元素拷贝给本身。
list(n,elem);           //构造函数将n个elem拷贝给本身。
list(const list &lst);  //拷贝构造函数。

list 赋值和交换

函数原型:

assign(beg, end);                   //将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);                    //将n个elem拷贝赋值给本身。
list& operator=(const list &lst);   //重载等号操作符
swap(lst);                          //将lst与本身的元素互换。

list 大小操作

函数原型:

size();             //返回容器中元素的个数
empty();            //判断容器是否为空
resize(num);        //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
                    //如果容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
                    //如果容器变短,则末尾超出容器长度的元素被删除。

list 插入和删除

push_back(elem);     // 在容器尾部加入一个元素
pop_back();          // 删除容器中最后一个元素
push_front(elem);    // 在容器开头插入一个元素
pop_front();         // 从容器开头移除第一个元素
insert(pos,elem);    // 在pos位置插elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);  // 在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end); // 在pos位置插入[beg,end)区间的数据,无返回值。
clear();             // 移除容器的所有数据
erase(beg,end);      // 删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);          // 删除pos位置的数据,返回下一个数据的位置。
remove(elem);        // 删除容器中所有与elem值匹配的元素。

插入 — insert 位置参数是迭代器
删除 — erase 位置参数是迭代器
移除 — remove 删除所有匹配元素

list 数据存取

front(); //返回第一个元素。
back(); //返回最后一个元素。

list容器中不可以通过 [ ] 或者 at 方式访问数据

list 反转和排序

reverse(); //反转链表
sort(); //链表排序

这两个是 list 类内部的成员函数

示例:

// 自定义比较函数,降序
bool myCompare(int val1 , int val2)
{
	return val1 > val2;
}

// 反转和排序
void test01()
{
	list<int> L;
	L.push_back(90);
	L.push_back(30);
	L.push_back(20);

	// 反转容器的元素
	L.reverse();

	// 排序
	L.sort();            // 默认的排序规则 从小到大
	L.sort(myCompare);   // 指定规则,从大到小
}

内容参考自黑马程序员C++教程从0到1入门编程课程和笔记

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值