STL好难(4):list的使用

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

和列表很像

1.list的介绍

点击这里查看 list 的官方文档

list类似数据结构中的链表

  • 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  • 2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
  • 3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。
  • 4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
  • 5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)

2.list的常见构造 

构造函数 (constructor) 接口说明
list (size_type n, const value_type& val = value_type()) 构造的list中包含n个值为val的元素
list() 构造空的list
list (const list& x) 拷贝构造函数
list (InputIterator first, InputIterator last) 用[first, last)区间中的元素构造list
// 构造空的L1
list<int> L1; 

// L2中放4个值为100的元素                    
list<int> L2(4, 100);

// 用L2的[begin(), end())左闭右开的区间构造L3
list<int> L3(l2.begin(), l2.end());  

// 用L3拷贝构造L4
list<int> L4(l3);                    

3.list的遍历方式

🍉迭代器:

begin 获取一个字符的迭代器, end获取最后一个字符下一个位置的迭代器

#include<iostream>
#include<list>
using namespace std;

int main()
{
	list<int> lt; // 定义容器lt
 
	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
 
	// 使用迭代器访问数据
	list<int>::iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
 
	return 0;
}

🍉范围for:

底层也用迭代器实现的

int main()
{
	list<int> lt; // 定义容器lt
 
	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
 
	// 使用范围for访问数据
	for (auto a : lt)
	{
		cout << a << " ";
	}
	cout << endl;

	return 0;
}

4.list的迭代器:

STL好难(4):list的使用,C++好难,c++,list,开发语言

🍉begin和end

通过 begin ()函数可以得到容器中第一个元素的正向迭代器

通过 end ()函数可以得到容器中最后一个元素的后一个位置的正向迭代器

#include<iostream>
#include<list>
using namespace std;

int main()
{
	list<int> lt; // 定义容器lt
 
	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
    
    //正向迭代器遍历容器
    list<int>::iterator it = lt.begin();
	//也可以用auto来自动识别:auto it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
 
	return 0;
}

 结果:

STL好难(4):list的使用,C++好难,c++,list,开发语言

🍉rbegin和rend

通过 rbegin 函数可以得到容器中最后一个元素的反向迭代器

通过 rend 函数可以得到容器中第一个元素的前一个位置的反向迭代器

#include<iostream>
#include<list>
using namespace std;

int main()
{
	list<int> lt; // 定义容器lt
 
	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
    
    //反向迭代器遍历容器
    list<int>::reverse_iterator it = lt.rbegin();
	//也可以用auto来自动识别:auto it = lt.rbegin();
	while (it != lt.rend())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
 
	return 0;
}

 STL好难(4):list的使用,C++好难,c++,list,开发语言

🍉C++11加入的迭代器

cbegin和cend,是const修饰的迭代器

crbegin和crend,是const修饰的反向迭代器

5.list的空间扩容

STL好难(4):list的使用,C++好难,c++,list,开发语言

🍉empty

判断链表是否为空,为空返回0,不为空,返回其他

如下面的例子:

int main()
{
	list<int> lt; 

	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

    int sum = 0;
	while (!lt.empty())
	{
		sum += lt.front();
		lt.pop_front();
	}

	std::cout << "total: " << sum << '\n';

	return 0;
}

当链表不为空时,sum+=头结点的值,然后进行头删,计算链表的累加结果。

🍉size

用于计算链表的大小

int main()
{
	list<int> lt;

	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

	std::cout << "size: " << lt.size() << '\n';

	return 0;
}

🍉max_size

返回链表可以容纳的最大元素数

6.list的元素访问:

STL好难(4):list的使用,C++好难,c++,list,开发语言

函数声明 接口说明
front 返回 list 的第一个节点中值的引用
back 返回 list 的最后一个节点中值的引用

7.list的元素修改:

官方文档内容:

STL好难(4):list的使用,C++好难,c++,list,开发语言

 需要重点掌握的内容:

函数声明 接口说明
push_front 在list首元素前插入值为val的元素
pop_fornt 删除list中第一个元素

push_back

在list尾部插入值为val的元素
pop_back 删除list中最后一个元素
insert 在list position 位置中插入值为val的元素
erase 删除list position位置的元素
swap 交换两个list中的元素
clear 清空list中的有效元素

需要注意,list没有定义find函数,需要用库里面的find来进行查找

如下:在3的前面插入30

int main()
{
	list<int> lt;

	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

	list<int>::iterator it = find(lt.begin(), lt.end(), 3);
	if (it != lt.end())
	{
		lt.insert(it, 30);
	}

	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	
	return 0;
}

STL好难(4):list的使用,C++好难,c++,list,开发语言

8.list的一些操作:

STL好难(4):list的使用,C++好难,c++,list,开发语言

splice:接合,将链表A结合到链表B的某个位置,注意这里不是拷贝过去,是真真正正的拿过去,接合后,链表A变为空

remove:就是find+erase,去除链表的一个元素,涉及到仿函数

unique:去重,也需要有序

merge:合并,两个有序链表合并,合并出来后依旧有序

sort:排序

        算法库里面已经提供了一个sort,为什么list里面还要提供一个sort
        STL好难(4):list的使用,C++好难,c++,list,开发语言

算法库里面的sort理论上可以传任何类型的参数

但是内部使用迭代器有要求,名字按时你要传随即迭代器

STL好难(4):list的使用,C++好难,c++,list,开发语言

preverse:逆置list链表文章来源地址https://www.toymoban.com/news/detail-545256.html

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

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

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

相关文章

  • C++ [STL之list的使用]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT vector是一片连续的空间,在数据访问上性能较好,但是任意位置插入删除性能较低,头插头删性能亦是如此;此时在这种需要频繁插入的场景下,显然链表是一种更好的选择,STL中实现了带头双选循环链表,本次我们来介绍该如何

    2024年02月07日
    浏览(81)
  • C++ STL学习之【list的使用】

    ✨个人主页: 北 海 🎉所属专栏: C++修行之路 🎊每篇一句: 图片来源 A year from now you may wish you had started today. 明年今日,你会希望此时此刻的自己已经开始行动了。 STL 中的 vector 存在头部及中部操作效率低的缺陷,需要另一种容器来弥补其短板,此时 list 就应运而生,

    2023年04月16日
    浏览(104)
  • C++ STL- list 的使用以及练习

    目录 0.引言 1. list 介绍  2. list 使用 2.1 构造函数 2.2 list iterator 的使用  3 list capacity  4. list element access  5. list modifiers  6. list 迭代器失效  7. list 与vector 对vector 8. OJ 题讲解  删除链表的倒数第 N  个节点: 本篇博客我们将介绍 STL 中 list 的使用,由于list STL 接口函数与之前

    2024年03月26日
    浏览(82)
  • 【C++STL基础入门】list基本使用

    STL(Standard Template Library)是C++标准库的一个重要组成部分,提供了一套丰富的数据结构和算法,可以大大简化C++程序的开发过程。其中,list容器是STL提供的一种双向链表实现的数据结构,具有高效的插入和删除操作,适用于需要频繁插入和删除元素的场景。本文将介绍list容

    2024年02月07日
    浏览(73)
  • 【STL】“list“容器从使用到模拟实现

    🎉博客主页:小智_x0___0x_ 🎉欢迎关注:👍点赞🙌收藏✍️留言 🎉系列专栏:C++初阶 🎉代码仓库:小智的代码仓库 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 list的底层是 双向链表结构 ,双向链表中每个元素存储在

    2024年02月16日
    浏览(87)
  • stl_list类(使用+实现)(C++)

    list是一个可以在常熟范围内任意位置进行插入和删除的序列式容器。 底层是带头双向循环链表 (链接中有对带头双向循环链表的逻辑分析)。 (constructor)构造函数声明 接口说明 list() 无参构造 list(size_type n, const T val = T() 构造并初始化n个val list(const list x) 拷贝构造 list(InputI

    2024年02月14日
    浏览(67)
  • 【C++STL】list的使用及其模拟实现

    list和sting、vector一样,我们可以使用cplusplus文档进行查询:list的文档介绍 【总结】 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代 2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通

    2023年04月19日
    浏览(72)
  • C++ STL之list的使用及模拟实现

    英文解释: 也就是说: list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。 list与forward_list非常

    2024年01月24日
    浏览(81)
  • 【C++STL精讲】list的使用教程及其模拟实现

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章我们

    2023年04月25日
    浏览(53)
  • C++ STL之list接口的详细使用指南

    本文详细介绍了C++ STL中list接口的使用,包括list的基本特性、底层结构、与其他容器的比较,以及各种操作方法如插入、删除、迭代、排序等。通过阅读本文,您将对C++中的list有更深入的理解。

    2024年02月13日
    浏览(95)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包