【C++】STL---list基本用法介绍

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

个人主页:平行线也会相交💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】💌
本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍
希望我们一起努力、成长,共同进步。🍓
【C++】STL---list基本用法介绍,C++之路,c++,list

list是STL中的一种容器,底层其实就是一个双向链表

既然底层实现是双向链表,所以list重要的一点就是插入和删除操作的时间复杂度为常数时间O(1),这是因为链表的结构不需要像数组一样进行内存重排。

当然,如果要频繁访问链表中的元素,需要沿着链表进行遍历,这导致list容器访问操作的时间复杂度为O(n)。
【C++】STL---list基本用法介绍,C++之路,c++,list

下面将对list中的常见的用法进行一一介绍。

一、创建变量

下面链表变量的创建:

list<int> it1;//创建一个空的list
list<int> it2 = { 1,2,3,4,5 };//创建一个带有初始元素的list

二、增删查改

1️⃣插入元素

插入元素总共分为三种:尾插、头插、任意位置插入
尾插(push_back()):

list<int> lt1;
lt1.push_back(1);
lt1.push_back(2);

头插(push_front()):

list<int> lt1;
lt1.push_front(1);
lt1.push_front(2);

任意位置插入删除(insert()):

//在第三个位置进行插入10
list<int> lt1;
lt1.push_back(1);
lt1.push_back(2);
lt1.push_back(3);
lt1.push_back(4);
list<int>::iterator it = lt1.begin();
for (size_t i = 0; i < 2; i++)
{
	it++;
}
lt1.insert(it, 10);
for (auto e : lt1)
{
	cout << e << " ";
}
cout << endl;

【C++】STL---list基本用法介绍,C++之路,c++,list

2️⃣删除

//删除的节点中数据为3的节点
list<int> lt1;
lt1.push_back(1);
lt1.push_back(2);
lt1.push_back(3);
lt1.push_back(4);
for (auto e : lt1)
{
	cout << e << " ";
}
cout << endl;

list<int>::iterator it = lt1.begin();
it = find(lt1.begin(), lt1.end(), 3);
//判断是否查找成功
if (it != lt1.end())
{
	lt1.erase(it);
	//节点此时已经被删除了,当前的迭代器失效
	//*it *= 10;
}
for (auto e : lt1)
{
	cout << e << " ";
}
cout << endl;

【C++】STL---list基本用法介绍,C++之路,c++,list

下面来删除list中的偶数元素:

list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);

	list<int>::iterator it = lt1.begin();
	while (it != lt1.end())
	{
		if (*it % 2 == 0)
		{
			it = lt1.erase(it);
		}
		else
		{
			it++;
		}
	}
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

【C++】STL---list基本用法介绍,C++之路,c++,list

3️⃣查找和修改

这里我们需要注意一点:std::list没有提供内置的find()函数

原因主要有两点:
第一遍历代替索引访问:由于std::list是一个双向链表,不支持通过索引来直接访问元素。相反,要访问或查找元素,需要使用迭代器进行迭代操作

第二:链表的特点是插入和删除元素的时间复杂度为O(1),但访问元素的时间复杂度为O(n),其中n是链表长度。相比之下,std::vector的访问时间复杂度为O(1)。由于链表不支持快速随机访问,使用线性搜索遍历整个链表可能是更高效的操作

举例:

//在链表中查找节点中数据为3的节点,如果查找成功,将该数据的数据*10
list<int> lt1;
lt1.push_back(1);
lt1.push_back(2);
lt1.push_back(3);
lt1.push_back(4);
for (auto e : lt1)
{
	cout << e << " ";
}
cout << endl;

list<int>::iterator it = lt1.begin();
it = find(lt1.begin(), lt1.end(), 3);
//判断是否查找成功
if (it != lt1.end())
{
	//查找成功则将迭代器位置的数据*10
	*it *= 10;
}
for (auto e : lt1)
{
	cout << e << " ";
}
cout << endl;
}

【C++】STL---list基本用法介绍,C++之路,c++,list
可以看到查找成功并将该节点的数据*10。

三、list大小计算

std::list提供了size()函数,用于返回链表中元素的数量
【C++】STL---list基本用法介绍,C++之路,c++,list

四、迭代器遍历

list<int> lt1 = { 1,2,3,4,5 };

for (auto it = lt1.begin(); it != lt1.end(); it++)
{
	(*it)++;
	cout << *it << " ";
}
cout << endl;

【C++】STL---list基本用法介绍,C++之路,c++,list

五、常见算法

1️⃣排序

list<int> lt = { 12,56,2,95,35,78,47 };
lt.sort();
for (auto e : lt)
{
	cout << e << " ";
}
cout << endl;

【C++】STL---list基本用法介绍,C++之路,c++,list

2️⃣删除指定值-remove()

这里需要注意的是:remove()函数会移除链表中所有与指定值相等的元素,而不仅仅是第一个匹配项。这与erase()函数的行为不同,erase()函数通常只移除第一个匹配项。

list<int> lt1 = { 12,56,2,95,35,78,47 };
lt1.remove(56);
for (auto e : lt1)
{
	cout << e << " ";
}
cout << endl;

【C++】STL---list基本用法介绍,C++之路,c++,list
如果链表中没有想要删除的指定值,则remove()函数不会作任何事情,也不会报错。请看举例:
【C++】STL---list基本用法介绍,C++之路,c++,list

3️⃣链表元素转移-splice()

在STL中,std::list提供了splice()函数,用于将一个链表的元素或者一个元素范围转移到另一个链表中。

splice()函数共有3个版本:

void splice(const_iterator position, list& x);
void splice(const_iterator position, list& x, const_iterator i);
void splice(const_iterator position, list& x, const_iterator first, const_iterator last);

下面对splice()函数的3个版本进行举例,请看:

list<int> lt1 = { 1,2,3,4 };
list<int> lt2 = { 10,20,30,40 };

list<int> lt3 = { 1,2,3,4 };
list<int> lt4 = { 10,20,30,40 };

list<int> lt5 = { 1,2,3,4 };
list<int> lt6 = { 10,20,30,40 };

// 将lt2中的所有元素移动到lt1的末尾
lt1.splice(lt1.end(), lt2);
for (auto e : lt1)
	cout << e << " ";
cout << endl;

// 将lt4中的第二个元素移动到lt3的开头
auto it3 = lt3.begin();
auto it4 = lt4.begin();
it4++;
lt3.splice(it3, lt4, it4);
for (auto e : lt3)
	cout << e << " ";
cout << endl;

//将lt6中的20 30 40移动到lt5的最后位置
auto first = ++lt6.begin();
auto end = lt6.end();
lt5.splice(lt5.end(), lt6, first, end);
for (auto e : lt5)
	cout << e << " ";
cout << endl;

运行结果如下:
【C++】STL---list基本用法介绍,C++之路,c++,list

好了,以上就是本文的全部内容,主要对list的一些基本语法和用法进行了介绍。
就到这里吧,再见啦友友们!!!
文章来源地址https://www.toymoban.com/news/detail-599966.html

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

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

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

相关文章

  • 【C++】STL——list的介绍和使用、list增删查改函数的介绍和使用、push_back、pop_back

    list构造函数的介绍和使用      push_front()函数用于将一个新的元素插入到链表的开头位置。 通过调用push_front()函数并将待插入的元素作为参数传递给该函数,即可实现在链表开头插入新元素的操作。   和链表的插入一样,push_front()函数的时间复杂度为O(1),因为在双向链

    2024年02月15日
    浏览(56)
  • STL——list用法

    1、list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2、list就是一个带头双向循环链表, list通常在任意位置进行插入、移除元素的执行效率更好。 3、 list最大的缺陷是不支持任意位置的随机访问。 有了前面使用string和vector的

    2024年02月12日
    浏览(43)
  • 【STL】:list用法详解

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关list的使用,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、 C + + 专 栏   : C++ Linux 专 栏 

    2024年02月06日
    浏览(38)
  • 【STL】list用法&试做_底层实现

    目录 一,list  使用 1. list 文档介绍  2. 常见接口 1.   list中的sort 2. list  + sort 与 vector  + sort效率对比 3. 关于迭代器失效 4. clear 二,list 实现 1.框架搭建  2. 迭代器类——核心框架 3. operator-  实现  4. const——迭代器 5. insert 6. erase 7. clear——实现 8. 拷贝构造  首先实现迭

    2024年02月16日
    浏览(37)
  • 【C++从0到王者】第十四站:list基本使用及其介绍

    如下所示,是库里面对list的基本介绍 链表是序列容器,允许在序列内的任何位置进行常量时间的插入和擦除操作,以及两个方向的迭代。 链表容器被实现为双链表;双链表可以将它们包含的每个元素存储在不同且不相关的存储位置。排序是通过与前面元素的链接和后面元素的

    2024年02月14日
    浏览(50)
  • 【STL】list常见用法及模拟实现(附完整源码)

    前言 这篇文章我们继续STL中容器的学习,这篇文章要讲解的是list。 1. list介绍及使用 1.1 list介绍 list文档 list的底层实现就是数据结构学过的带头双向循环链表: 1.2 list使用 我们来看一下几个常用的接口: 首先看一下构造函数: 这里几个都是我们熟悉的,默认构造、n个val构

    2024年02月07日
    浏览(45)
  • 【C++STL基础入门】list基本使用

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

    2024年02月07日
    浏览(72)
  • [STL]list使用介绍

    注:本文测试环境是visual studio2019。 list是可以在常量时间内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。 list与

    2024年02月15日
    浏览(55)
  • C++:STL--List

    STL容器的代码设计中, 模板编程 和 代码复用的思想贯穿始终 ,代码复用可以将各个成员接口统一起来从而 大大增加程序的可读性和可维护性 ,模板编程使得容器类可以 根据需要用于存储各种不同类型的数据 . C++STL标准库中的list使用的数据结构是带头双向循环链表 ; 链表的头

    2024年02月10日
    浏览(44)
  • 【C++】STL---list

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

    2024年02月11日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包