[C++随笔录] list使用

这篇具有很好参考价值的文章主要介绍了[C++随笔录] list使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

list的底层结构就是 带头双向循环链表

构造函数

[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构

// 默认构造
list<int> lt;
cout << "lt->";
for (auto it : lt)
{
	cout << it << " ";
}
cout << endl;

// 用n个val来进行初始化
list<int> lt1(10);
cout << "lt1->";
for (auto it : lt1)
{
	cout << it << " ";
}
cout << endl;

list<int> lt2(10, 1);
cout << "lt2->";
for (auto it : lt2)
{
	cout << it << " ";
}
cout << endl;

// 迭代器区间进行初始化
list<int> lt3(lt2.begin(), lt2.end());
cout << "lt3->";
for (auto it : lt3)
{
	cout << it << " ";
}
cout << endl;

// 拷贝构造
list<int>lt4 = lt3;
cout << "lt4->";
for (auto it : lt4)
{
	cout << it << " ";
}
cout << endl;

运行结果:

lt->
lt1->0 0 0 0 0 0 0 0 0 0
lt2->1 1 1 1 1 1 1 1 1 1
lt3->1 1 1 1 1 1 1 1 1 1
lt4->1 1 1 1 1 1 1 1 1 1

insert && 迭代器

[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构
[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构
[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构

看来list并没有 重载 + 运算符
但是重载了++


list<int> lt2(10, 1);
cout << "lt2->";
for (auto it : lt2)
{
cout << it << " ";
}
cout << endl;

cout << "插入->";
lt2.insert(lt2.begin()++, 10);
for (auto it : lt2)
{
	cout << it << " ";
}
cout << endl;

运行结果:

lt2->1 1 1 1 1 1 1 1 1 1
插入->10 1 1 1 1 1 1 1 1 1 1

如果, 我们想要在 第五个位置进行插入该怎么办?

list<int> lt2(10, 1);
cout << "lt2->";
for (auto it : lt2)
{
cout << it << " ";
}
cout << endl;

// 先找到下标为5的迭代器
auto it = lt2.begin();
for (int i = 0; i < 5; i++)
{
	++it;
}

list<int>::iterator c = lt2.insert(it, 50);
cout << "插入->";
for (auto it : lt2)
{
	cout << it << " ";
}
cout << endl;

cout << "insert返回值的解引用->" << * c << endl;

运行结果:

lt2->1 1 1 1 1 1 1 1 1 1
插入->1 1 1 1 1 50 1 1 1 1 1
insert返回值的解引用->50

list迭代器遍历时,while循环的判断条件只能是!=,不能是<
[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构

list<int> lt2(10, 1);
cout << "lt2->";
for (auto it : lt2)
{
cout << it << " ";
}
cout << endl;

// 迭代器遍历
list<int>::iterator it = lt2.begin();
cout << "迭代器遍历->";
while (it != lt2.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;

运行结果:

lt2->1 1 1 1 1 1 1 1 1 1
迭代器遍历->1 1 1 1 1 1 1 1 1 1

push_back && pop_back && push_front && pop_front

	list<int> lt2(5, 1);
	cout << "lt2->";
	for (auto it : lt2)
	{
		cout << it << " ";
	}
	cout << endl;


	lt2.pop_back();
	lt2.pop_back();
	lt2.pop_back();
	lt2.pop_back();
	cout << "尾删->";
	for (auto it : lt2)
	{
		cout << it << " ";
	}
	cout << endl;

	lt2.push_back(13);
	lt2.push_back(30);
	lt2.push_back(45);
	lt2.push_back(6);
	lt2.push_back(60);
	lt2.push_back(5);
	lt2.push_back(7);
	cout << "尾插->";
	for (auto it : lt2)
	{
	cout << it << " ";
	}
	cout << endl;


	lt2.pop_front();
	lt2.pop_front();
	lt2.pop_front();
	lt2.pop_front();
	lt2.pop_front();
	cout << "头删->";
	for (auto it : lt2)
	{
		cout << it << " ";
	}
	cout << endl;


	lt2.push_front(25);
	lt2.push_front(55);
	lt2.push_front(9);
	lt2.push_front(6);
	lt2.push_front(20);
	cout << "头插->";
	for (auto it : lt2)
	{
		cout << it << " ";
	}
	cout << endl;

运行结果:

lt2->1 1 1 1 1
尾删->1
尾插->1 13 30 45 6 60 5 7
头删->60 5 7
头插->20 6 9 55 25 60 5 7

erase

[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构

// 删除lt2中的所有奇数
auto it = lt2.begin();
while (it != lt2.end())
{
	if ((*it) % 2 == 1)
	{
		// erase返回删除后的下一个节点的地址 -- 更新了it
		it = lt2.erase(it); 
	}
else
	{
		// 不是奇数, 那就++
		it++;
	}
}
cout << "删除所有奇数->";
for (auto it : lt2)
{
cout << it << " ";
}
cout << endl;

运行结果:

lt2->1 1 1 1 1 1 13 30 45 6
删除所有奇数->30 6

但是我们需要注意: erase的形参是不能再使用的, 切记!切记!
[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构

sort && find && reverse

当我们调用 算法库中的sort:
[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构
[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构
🗨️这是怎么一回事?

  • 其实, 迭代器可以按照性质(有底层结构决定)来进行划分:
    单向迭代器 – – 可以进行 ++
    比如: forward_list/ unordered_map/ unordered_set
    双向迭代器 – – 可以进行 ++/ –
    比如: list/ map/ set
    随机迭代器 – – 可以进行+/ - / ++/ –
    比如: vector/ deque/ string

[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构
但是std::sort的迭代器使用的是 随机迭代器类型 ⇒ 故 list不能使用算法库中的sort算法

但list类中自带sort算法👇👇👇
[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构

//sort(lt2.begin(), lt2.end());
lt2.sort();
cout << "升序->";
for (auto e : lt2)
{
	cout << e << " ";
}
cout << endl;

lt2.sort(greater<int>());
cout << "降序->";
for (auto e : lt2)
{
	cout << e << " ";
}
cout << endl;

运行结果:

升序->1 5 6 7 13 30 45 60
降序->60 45 30 13 7 6 5 1

温馨提示:

list自带的排序很慢的, 小数据量(<10万)的可以用用,
但大数据量还不如 将数据拷贝到vector中, vector排好序之后, 再将结果拷贝回去快
使用好 对应的容器, 对效率来说很重要的

find函数list并没有, 但是可以用算法库中的
[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构

list函数自带reverse函数, 但其实还不如用库里的

[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构

[C++随笔录] list使用,C++,c++,list,windows,stl,算法,数据结构


学须反己。若徒责人,只见得人不是,不见自己非。若能反己,方见自己有许多未尽处,奚暇责人? — — 王阳明
译: 有位朋友经常因为生气而指责别人。王阳明告诫他说:“学习应该反身自省。如果只去指责别人,就只能看到别人的错误,就不会看到自己的缺点。若能返身自省,才能看到自己有许多不足之处,哪还有时间去指责别人?
舜的弟弟叫象,象屡次想害死舜,但舜还是照样疼他。王阳明说,舜之所以能感化象的傲慢,最主要的就是舜不去看象的不是。如果舜坚决要去纠正象的奸恶,只会看到象的不是,而象又是一个傲慢的人,肯定不会认错,舜又岂能感化他?” 这位朋友听了这番话,甚感惭愧。
文章来源地址https://www.toymoban.com/news/detail-727397.html

到了这里,关于[C++随笔录] list使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++入门】STL容器--vector底层数据结构剖析

    目录  前言  1. vector的使用       vector的构造  vector迭代器  vector空间相关的接口  vector 功能型接口  find  swap  insert  erase 2. vector内部数据结构剖析 reserve  push_back和pop_back size、capacity、empty、operator[ ];  insert和erase resize swap  拷贝构造和赋值重载 构造函数补充  迭代器

    2024年01月25日
    浏览(57)
  • 【数据结构和算法】使用数组的结构实现链表(单向或双向)

    上文我们通过结构体的结构实现了队列 、以及循环队列的实现,我们或许在其他老师的教学中,只学到了用结构体的形式来实现链表、队列、栈等数据结构,本文我想告诉你的是,我们 可以使用数组的结构实现链表、单调栈、单调队列 目录 前言 一、用数组结构的好处 1.数

    2024年01月20日
    浏览(74)
  • 数据结构之list类

    list是列表类。从list 类开始,我们就要接触独属于 Python 的数据类型了。Python 简单、易用,很大一部分原因就是它对基础数据类型的设计各具特色又相辅相成。 话不多说,让我们开始学习第一个 Python 数据类型一list。 1. list的赋值 输出结果 2. Python中list的知识点 list 类与str类

    2024年01月19日
    浏览(38)
  • Redis数据结构 — List

    目录 链表结构设计 ​编辑链表节点结构设计 链表的优势与缺陷 Redis 的 List 对象的底层实现之一就是链表。C 语言本身没有链表这个数据结构的,所以 Redis 自己设计了一个链表数据结构。 有前置节点和后置节点,本质为 双向链表 Redis 的链表实现优点如下: listNode 链表节点

    2024年02月16日
    浏览(39)
  • 【Redis】数据结构 - List

    使用场景 Redis数据结构list适用于需要保留多个有序元素的场景,如消息队列、任务队列、最近联系人列表等。具体应用包括: 消息队列:将需要处理的消息按照先后顺序放入list中,再使用消费者程序逐一取出进行处理。 任务队列:将需要执行的任务按照优先级或时间顺序放

    2023年04月08日
    浏览(44)
  • Redis数据结构——链表list

    链表是一种常用的数据结构,提供了顺序访问的方式,而且高效地增删操作。 Redis中广泛使用了链表,例如:列表的底层实现之一就是链表。 在Redis中,链表分为两部分:链表信息 + 链表节点。 链表节点用来表示链表中的一个节点,基础的值和指向前和后的指针 链表信息,

    2024年02月13日
    浏览(39)
  • 数据结构与算法(七)--使用链表实现栈

    之前我们已经学习了链表的所有操作及其时间复杂度分析,我们可以了解到 对于链表头的相关操作基本都是O(1)的,例如链表头增加、删除元素,查询元素等等 。 那我们其实有一个数据结构其实可以完美利用到这些操作的特点,都是在某一段进行操作,那就是栈 。本章我们

    2024年02月07日
    浏览(54)
  • 数据结构编程题:Phone List

    Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let’s say the phone catalogue listed these numbers: 段落大意:给定一组电话号码,判断它们是否一致,即没有一个号码是另一个号码的前缀。假设电话目录列出了以下号码: Emergency 911 Alice 97 625 999

    2024年01月22日
    浏览(60)
  • day32 泛型 数据结构 List

     概述         JDK1.5同时推出了两个和集合相关的特性:增强for循环,泛型         泛型可以修饰泛型类中的属性,方法返回值,方法参数, 构造函数的参数 Java提供的泛型类/接口 Collection, List, Set,Iterator 等 自定义的泛型 public class Student H,W {} 自定义的泛型方法 public

    2024年02月09日
    浏览(42)
  • 3.redis数据结构之List

    列表类型:有序、可重复 Arraylist是使用数组来存储数据,特点:查询快、增删慢 Linkedlist是使用双向链表存储数据,特点:增删快、查询慢,但是查询链表两端的数据也很快。 Redis的list是采用来链表来存储的,所以对于redis的list数据类型的操作,是操作list的两端数据来操作

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包