【C++】list的使用

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

list的底层结构是双向循环链表,在任意位置插入和删除效率很高,但是不支持任意位置的随机访问。
【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习
下面来介绍一些常用的list接口:

1 构造

1.1 无参构造

list()

list<int> lt;

1.2 构造的list中包含n个值为val的元素

list (size_type n, const value_type& val = value_type())

list<int> lt(6, 77);

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

1.3 用[first, last)区间中的元素构造list

只要是迭代器都可以在其范围内初始化它的内容

list (InputIterator first, InputIterator last)

	list<int> lt1{ 1,2,3,4,5 };
	list<int> lt2(lt1.begin(), lt1.end());

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

1.4 拷贝构造

list (const list& x)

	list<int> lt1{ 1,2,3,4,5,6,7 };
	list<int> lt2(lt1);

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

2 迭代器的使用

2.1 begin + end

返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器

list<int> lt{ 1,2,3,4,5,6,7,8,9,10 };
list<int>::iterator it = lt.begin();
while (it != lt.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

2.2 rbegin + rend

返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置

list<int> lt{ 1,22,3,44,5,6,67,8,91,10 };
list<int>::reverse_iterator it = lt.rbegin();
while (it != lt.rend())
{
	cout << *it << " ";
	++it;
}
cout << endl;

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

3 容量操作

list不需要扩容,它的每个节点是独立的一块空间,根据需求来进行新增节点或者删除节点。

3.1 empty + size

empty :检测list是否为空,是返回true,否则返回false
size:返回list中有效节点的个数

list<int> lt{ 1,2,3,4,5 };
cout << lt.empty() << endl;//0
cout << lt.size() << endl;//5

4 获取元素

4.1 front + back

返回list第一个节点的值和最后一个节点的值

list<int> lt{ 1,2,3,4,5 };
cout << lt.front() << endl;//1
cout << lt.back() << endl;//5

5 插入、删除、修改

5.1 头插-push_front和尾插-push_back

list<int> lt{ 1,2,3,4,5 };
lt.push_front(100);
lt.push_back(1000);
for (auto e : lt)
{
	cout << e << " ";
}
cout << endl;

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

5.2 头删-pop_front和尾删-pop_back

list<int> lt{ 1,2,3,4,5 };
lt.pop_front();
lt.pop_back();
for (auto e : lt)
{
	cout << e << " ";
}
cout << endl;

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

5.3 交换——swap

	list<int> lt1{ 1,2,3,4,5 };
	list<int> lt2{ 6,7,8,9,10 };
	lt1.swap(lt2);

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

5.4 清理——clear

清空有效元素,保留哨兵位节点

list<int> lt{ 1,2,3,4,5 };
lt.clear();
lt.push_back(1);
for (auto e : lt)
{
	cout << e << " ";
}
cout << endl;

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

5.5 insert-pos位置插入元素

list<int> lt{ 1,2,3,4,5 };
auto pos = find(lt.begin(), lt.end(), 3);
lt.insert(pos, 100);
for (auto e : lt)
{
	cout << e << " ";
}
cout << endl;

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

5.6 erase-pos位置删除元素

list<int> lt{ 1,2,3,4,5 };
auto pos = find(lt.begin(), lt.end(), 3);
lt.erase(pos);
for (auto e : lt)
{
	cout << e << " ";
}
cout << endl;

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

6 迭代器失效问题

前面的例子中都只是使用一次,如果重复使用可能会出现迭代器失效问题,先来insert。

list<int> lt{ 1,2,3,4,5 };
auto pos = find(lt.begin(), lt.end(), 3);
lt.insert(pos, 100);
lt.insert(pos, 999);

按正常的思路,第一次在3的前面插入100,第二次在100前面插入999,但是:
【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习
list的insert不会出现迭代器失效的问题,但是会出现以上的情况,因为pos指向元素为3的节点,第一次插入是3的前面没有问题,但是第二次插入时pos还是指向元素3,所以插入999还是在元素3的前面插入。

恢复正常逻辑,只需要给pos重新赋值即可。

注:insert和erase是可以有返回值的,返回的是迭代器
【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习
【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

pos = lt.insert(pos, 100);
lt.insert(pos, 999);

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习

erase重复使用就会出现因迭代器失效而报错的问题了
先看代码:

list<int> lt{ 1,2,3,4,5 };
auto pos = find(lt.begin(), lt.end(), 3);
lt.erase(pos);
lt.erase(pos);

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习
因为第一次删除pos位置的节点,该节点已经不存在了,第二次删除还是使用上一次的pos,所以会报错。解决方法就是给pos重新赋值

pos = lt.erase(pos);//下一次如果使用,必须重新赋值
lt.erase(pos);//最后一次使用赋不赋值没有关系

【C++】list的使用,c++,list,windows,开发语言,c语言,数据结构,学习文章来源地址https://www.toymoban.com/news/detail-820489.html

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

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

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

相关文章

  • 数据结构中: 一元多项式的运算(相加,相减,相乘)------用C语言 / C++来实现。 数据结构线性表的操作和应用(顺序存储)

    线性表的操作和应用(顺序存储)。用顺序存储实现一元多项式,并进行加、减、乘运算。 (1)一元多项式结构体创建  (2)初始化 (3)一元多项式赋值             (4)打印一元多项式 (5)加法运算                        (6)减法运算 (7)乘法运算    全部代

    2024年02月01日
    浏览(65)
  • 追梦之旅【数据结构篇】——详解小白如何使用C语言实现堆数据结构

        😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主! 😘博主小留言:哈喽! 😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不

    2023年04月17日
    浏览(47)
  • 数据结构之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)
  • C语言自定义数据类型(二)使用结构体数组

    一个结构体变量中可以存放一组有关联的数据(如一个学生的学号、姓名、成绩等数据)。如果有 10 个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别

    2024年01月19日
    浏览(49)
  • 数据结构编程题: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

领红包