Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >走近STL -- 你好,List

走近STL -- 你好,List

作者头像
看、未来
发布于 2020-08-26 02:42:10
发布于 2020-08-26 02:42:10
39100
代码可运行
举报
运行总次数:0
代码可运行

1、你好,List

从实现层面看,相较于Vector的线性空间,List的实现要复杂的多。 List的优势在于每次插入或删除一个元素,就分配或释放一个位置。因此,List对于空间的把控有绝对的精准。 而且,对于从任何节点增删数据,List消耗的永远是常数时间。

List和Vector的使用应该视元素的多寡、元素的构造复杂度、元素的存取频繁度而定。List优在存取,Vector优在查询。

2、List节点

每一个自己写过链表的人都知道,链表的节点和链表本身是分开设计的。 那我们来看一下List的节点设计:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T>
struct __list_node
{
	typedef void* void_pointer;
	void_pointer prev;
	void_pointer neet;
	T date;
}

显而易见,这是一个通用双向链表的节点(如果对通用链表不了解,建议一定要自己动手设计一个)。

3、List基本函数使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<list>

typedef struct rect
{
	···
}Rect;

list<Rect>test;	//声明一个链表,用于存放结构体数据

//如果想以其他方法初始化list列表,可以移步到下一行那个Vector的介绍
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Rect a;
···
test.push_back(a);
test.push_front(a);
//头尾插入(双向链表)

//定点插入
test.insert(test.begin()+10,a);	//在第十个节点之前插入a
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//删除test头部的元素
	test.erase(test.begin());

//删除test从头到尾的元素
	test.erase(test.begin(), test.end());

test.pop_back();
test.pop_front();

其实增删还是推荐使用迭代器来,因为直接对数据进行操作会存在一定的危险。 在本文第三部分详细讲述了List迭代器操作增删。

除了这个函数:test.clear();这个函数安全得很,反正都清理掉了。

  1. 查、改
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//迭代器
list<int>::iterator p;
for (p = test.begin(); p != test.end(); p++)
		cout << *p << " ";

要遍历还是首推迭代器。所有和遍历有关的还是用迭代器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<algorithm>
test.sort(test.begin(),test.end());	//从头到尾,默认从小到大排序

//一般排序都是要自定义排序的:
bool Comp(const int &a,const int &b)
{
    return a>b;
}
sort(test.begin(),test.end(),Comp);	//这样就降序排序。 
  1. 大小
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test.size();	//容器已存入数据量
test.capacity();	//容器还能存多少数据量

//其实不用担心容器不够大,容量要满的时候它会自己扩容
  1. 其他 (1)压缩list
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//去除重复的元素至只保留一个副本
	test.unique();
	//已经过大小排序的list才能使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	(2)合并list
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test.splice(test.end(),test2);//将test2剪切到test后面

最后还是要提一下头文件: 分不清楚就都写上

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<algorithm>
#include<list>

4、迭代器

List的迭代器和Vector还是有一定区别的,所以我特地分一块出来。 List的迭代器不能随便用普通指针来替代,因为其节点不会在内存中持续存在。

List的迭代器在有一个很好的特性,就是它不会因为节点的增加或合并(splice)操作而失效,即使是删除,也只会使得当前指向被删节点的那个迭代器失效,而不会因记忆体的重置使得全部的迭代器失效。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
走近STL - Vector,再次见面
在Leecode上做了一些vector的题目,有了新的感悟,所以重新对这篇文章进行一次脱胎换骨式的修改。
看、未来
2020/08/26
4160
数据结构(二): 链表篇
链表在C语言的数据结构中的地位可不低。后面很多的数据结构,特别是树,都是基于链表发展的。 所以学好链表,后面的结构才有看的必要。
看、未来
2021/09/18
2930
为实习准备的数据结构(2)-- 详尽链表篇
链表在C语言的数据结构中的地位可不低。后面很多的数据结构,特别是树,都是基于链表发展的。
看、未来
2021/03/11
3140
C++(STL):15--- list源码剖析
一、list概述 总的来说:环形双向链表 特点: 底层是使用链表实现的,支持双向顺序访问 在list中任何位置进行插入和删除的速度都很快 不支持随机访问,为了访问一个元素,必须遍历整个容器 与其他容器相比,额外内存开销大 设计目的:令容器在任何位置进行插入和删除都很快 何时使用: 容器需要不断地在中间插入或删除元素 无论删除还是增加,list的迭代器、引用、指针都不会失效 与其他容器的比较: vector 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 deque 双端队列。支持快速
用户3479834
2021/02/03
7780
C++(STL):15--- list源码剖析
探索C/C++的奥秘之list
list和我们之前讲的东西都一样,list第二个参数是一个空间配置器,是一个内存池, 底层是一个带头双向循环列表。list可以重载[],但是效率太低了。
用户11290648
2024/11/21
510
探索C/C++的奥秘之list
【C++指南】STL list容器完全解读(一):从入门到掌握基础操作
在C++标准模板库(STL)中,list是一个基于双向链表实现的序列容器。它允许在任意位置进行高效插入和删除操作,时间复杂度为O(1)。与vector不同,list不保证元素在内存中的连续存储,因此不支持随机访问。
倔强的石头_
2025/05/31
900
【C++指南】STL list容器完全解读(一):从入门到掌握基础操作
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
C++ 标准模板库(STL)中的 list 容器是一个双向链表结构,它提供了高效的插入和删除操 作。与 vector 不同,list 中的元素不是连续存储的,因此可以在任何位置高效插入和删除元素,而无需移动其他元素。虽然它在随机访问方面不如 vector 高效,但在大量的插入和删除操作场景中具有不可替代的优势。
半截诗
2024/10/09
5260
【C++】list(上)
list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代
s-little-monster
2024/09/09
940
【C++】list(上)
【C++】手搓 list 容器
List是C++标准模板库(STL)中的一个成员,其本质为带头双向循环链表。不同于连续的、紧密排列的数组容器Vector,List容器的内部是由双向链表构成的,使得它在插入和删除操作上,就如同行云流水一般顺畅,不需移动其它元素。
叫我龙翔
2024/04/10
1160
【STL】list的使用
list本身与list节点,这两个是完全不同的结构,是需要分开来设计的,对于一个list节点来说,由于list是双向环状链表(双向带头循环链表),所以需要提供两个指针,一个指向前一个元素,一个指向另一个元素,同时还需要一个val,用来存储数据。如下所示为SGI版本的list底层(稍作修改,便于学习):
诺诺的包包
2023/10/15
3390
【STL】list的使用
开发成长之路(6)-- C++从入门到开发(C++知名库:STL入门·容器(一))
其实我刚开始也没想到会写这么快,明显后面几篇的数据跟不上第一篇啦。可能是有一部分朋友对CSDN还不是很了解吧。 在文中的蓝字是可以点击的超链接,在文章标题下面有文章所属专栏,也是可以点击的,我这一系列的文章都在一个专栏下: 开发成长之路 你们可以慢慢看,不懂的随时私信我,我在CSDN上还是比较活跃的,一般一个小时内都能回复。
看、未来
2021/09/18
3550
【C++进阶】深入STL之list:高效双向链表的使用技巧
前言:双向链表是链表数据结构的一种重要变体,它允许我们在链表的任何位置进行高效的插入和删除操作,而无需像数组那样进行大量的数据移动。list容器正是基于这种数据结构实现的,它提供了丰富的成员函数和迭代器接口,让我们能够轻松地管理和操作链表元素 让我们一起走进STL中list容器的世界,探索其背后的奥秘吧!
Eternity._
2024/06/14
5840
【C++进阶】深入STL之list:高效双向链表的使用技巧
C++ STL学习之【list的使用】
STL 中的 vector 存在头部及中部操作效率低的缺陷,需要另一种容器来弥补其短板,此时 list 就应运而生,list 是一个双向带头循环链表,是链表的终极形态,除了不支持下标的随机访问外,其他方面效率都是极高的,本文将带大家认识、使用 list 容器
北 海
2023/07/01
2610
C++ STL学习之【list的使用】
【C++】list介绍
list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list中一些常见的重要接口。
zxctscl
2024/04/02
1160
【C++】list介绍
C++STL——list类与模拟实现
list是一个带头双向循环链表。 list文档介绍:https://legacy.cplusplus.com/reference/list/list/ list因为是链表结构,所以没有 [] 去访问数据的方式,只有用迭代器,list当中迭代器是很重要的。 这里透彻尾插不会导致迭代器失效问题,不过删除会导致迭代器失效。 list还有一个特性,就是他的sort排序接口函数效率是低于算法库中排序的效率。 更多内容就配合模拟实现来看。
有礼貌的灰绅士
2023/03/28
2560
C++STL——list类与模拟实现
【c++丨STL】list的使用
之前我们已经学习了string、vector两个容器的使用方法及模拟实现,今天跟大家介绍list的使用方法。
ephemerals__
2024/11/20
1720
【c++丨STL】list的使用
C++第十一弹 -- STL之List的剖析与使用
本篇我们旨在探讨对于STL中list的使用, 下一篇我们将会对list进行底层剖析以及模拟实现, list是C++标准模板库中的一种容器, 它是一个双向循环链表, 能够在任意位置进行插入和删除操作.
用户11317877
2024/10/16
810
C++第十一弹 -- STL之List的剖析与使用
STL 总结与常见面试题
为了建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability),诞生了STL。
C语言与CPP编程
2020/10/16
9480
【C++修行之道】STL(初识list、stack)
list容器提供了一系列成员函数和迭代器来操作和访问链表中的元素,包括插入、删除、访问、反转等操作。可以使用迭代器来遍历链表中的元素。
走在努力路上的自己
2024/01/28
2620
【C++修行之道】STL(初识list、stack)
深入探索 C++ STL: 高效双向链表 list 的使用与实践
C++ STL(Standard Template Library)的 list 容器是双向链表的实现,适合需要频繁插入和删除元素的场景。在这篇文章中,我将详细介绍 list 的特性、使用场景、常见的操作和使用示例,帮助读者全面掌握 list 的用法。本文分为以下几部分:
用户11286421
2024/10/20
1790
相关推荐
走近STL - Vector,再次见面
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验