当前位置: 首页 > news >正文

【C++】STL中list的使用

前言:在前面学习的 过程中我们学习了STL中的string,vector,今天我们来进一步的学习STL中的list的使用方法。

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:高质量C++学习 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


目录标题

  • List常见的使用方法
    • 什么是list
    • List的常见构造方式
    • list中迭代器的使用
    • list的增删改查
    • list访问和修改元素
    • 元素的数量和清空list
    • 对list进行升序排序
    • 反转list中的元素的顺序
    • 删除list中所有等于给定值的元素


List常见的使用方法

什么是list

在C++中,list是一个双向链表容器(带头双向链表如下所示)。它是C++标准库中的一种容器类型,可以用来存储和管理数据。list的特点是可以高效地执行插入和删除操作,但是在访问和搜索元素方面相对较慢。

list的元素类型可以是任意类型,包括基本数据类型和自定义的对象类型。list容器提供了一系列的成员函数和操作符,可以用于在链表中插入、删除和访问元素,以及对链表进行遍历和操作。

通过使用list容器,可以方便地实现一些功能,如实现队列或栈、排序和合并链表等。由于其特殊的数据结构,list在某些场景下比其他容器类型更适用,例如需要高效地在容器中插入和删除元素,而对访问元素的速度要求较低的情况。

在这里插入图片描述


List的常见构造方式

在C++中,list可以通过多种方式进行构造。以下是几种常见的构造方式:

  1. 默认构造函数:创建一个空的list对象。

    std::list<int> myList; // 创建一个空的list对象
    
  2. 带有初始化列表的构造函数:使用初始化列表创建一个list对象,并将其中的元素添加到list中。

    std::list<int> myList = {1, 2, 3}; // 使用初始化列表创建list对象并添加元素
    
  3. 带有指定元素个数和初始值的构造函数:创建一个包含指定元素个数和初始值的list对象。

    std::list<int> myList(5, 0); // 创建一个包含5个初始值为0的元素的list对象
    
  4. 通过迭代器范围构造函数:创建一个list对象,并将指定范围内的元素添加到list中。

    std::vector<int> vec = {1, 2, 3};
    std::list<int> myList(vec.begin(), vec.end()); // 通过迭代器范围创建一个list对象,并将vec中的元素添加到list中
    
  5. 拷贝构造函数:使用另一个list对象创建一个新的list对象,两个list对象共享元素。

    std::list<int> myList1 = {1, 2, 3};
    std::list<int> myList2(myList1); // 使用myList1创建一个新的list对象myList2,两个list对象共享元素
    

这些是一些常见的list构造方式,可以根据实际需求选择合适的方式来构造list对象。


list中迭代器的使用

在C++中,可以使用list的iterator来访问和操作list容器中的元素。以下是一些常见的list iterator的使用方法。

  1. 声明和初始化iterator
std::list<int> mylist = { 1,2,3,4,5 };
std::list<int>::iterator it = mylist.begin();//获取指向list第一个元素的迭代器
std::list<int>::iterator end = mylist.end(); // 获取指向list尾部的迭代器
  1. 迭代器遍历list
int main()
{std::list<int> mylist = { 1,2,3,4,5 };std::list<int>::iterator it = mylist.begin();//获取指向list第一个元素的迭代器std::list<int>::iterator end = mylist.end(); // 获取指向list尾部的迭代器while (it != end){std::cout << *it << " "; // 使用*操作符获取迭代器指向的元素it++;}return 0;
}

在这里插入图片描述
3. 使用迭代器修改list元素

int main()
{std::list<int> mylist = { 1,2,3,4,5 };std::list<int>::iterator it = mylist.begin();//获取指向list第一个元素的迭代器std::list<int>::iterator end = mylist.end(); // 获取指向list尾部的迭代器while (it != end){if (*it != 5)//通过迭代器修改元素的值{*it = 5;}std::cout << *it << " "; // 使用*操作符获取迭代器指向的元素it++;}return 0;
}

在这里插入图片描述
4. 范围for遍历list:

int main()
{list<int> mylist;vector<int> vec = { 1,3,4,5 };list<int> lt(vec.begin(), vec.end());list<int>::iterator it = lt.begin();for (auto e : lt){cout << *it << " ";it++;}return 0;
}

list的增删改查

myList.push_back(10); // 在list尾部添加元素
myList.push_front(20); // 在list头部添加元素
myList.pop_back(); // 删除list尾部的元素
myList.pop_front(); // 删除list头部的元素

list访问和修改元素

int firstElement = myList.front(); // 访问list头部的元素
int lastElement = myList.back(); // 访问list尾部的元素
myList.front() = 100; // 修改list头部的元素
myList.back() = 200; // 修改list尾部的元素

元素的数量和清空list

int size = myList.size(); // 获取list中元素的数量
bool isEmpty = myList.empty(); // 判断list是否为空
myList.clear(); // 清空list中的所有元素

对list进行升序排序

int main()
{list<int> lt = { 10,20,0,-1,9,20,30 };lt.sort();list<int>::iterator it = lt.begin();for (auto e : lt){cout << *it << " ";it++;}return 0;
}

在这里插入图片描述


反转list中的元素的顺序

int main()
{list<int> lt = { 10,20,0,-1,9,20,30 };lt.sort();list<int>::iterator it = lt.begin();for (auto e : lt){cout << *it << " ";it++;}cout << endl;lt.reverse();//更新迭代器,因为迭代器失效it = lt.begin();for (auto e : lt){cout << *it << " ";it++;}return 0;
}

在这里插入图片描述


删除list中所有等于给定值的元素

int main()
{list<int> lt = { 10,10,20,30,10};lt.remove(10);//删除所有为10的元素list<int>::iterator it = lt.begin();for (auto e : lt){cout << *it << " ";it++;}return 0;
}

在这里插入图片描述
这些是一些list常见功能的使用方法,可以根据实际需求选择合适的方式来操作和处理list容器中的元素


好啦,今天的内容就到这里啦,下期内容预告stl中list的使用.


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🌏🗺️ 这里祝各位接下来的每一天好运连连 💞💞

相关文章:

  • powerdesigner各种字体设置
  • 深度解析:全流量分析与IP会话回溯在IT运维中的应用
  • matlab演示银河系转动动画
  • 进程概念(二)
  • pytest配置文件配置并通过allure生成报告
  • 使用difflib实现文件差异比较用html显示
  • Ansible离线部署 之 Zabbix
  • c语言基础篇C
  • linux centos consul1.15.2一键安装部署
  • 【差分数组】1674. 使数组互补的最少操作次数
  • 【文末附gpt升级秘笈】AI热潮降温与AGI场景普及的局限性
  • 集合体学习01
  • 写一个标准的项目说明书大纲
  • GitHub工程git merge出现冲突处理方式
  • 接口请求的六种常见方式详解(get、post、head等)
  • [译] 怎样写一个基础的编译器
  • 【Linux系统编程】快速查找errno错误码信息
  • Cumulo 的 ClojureScript 模块已经成型
  • Javascript Math对象和Date对象常用方法详解
  • Kibana配置logstash,报表一体化
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 复杂数据处理
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端临床手札——文件上传
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 学习使用ExpressJS 4.0中的新Router
  • 如何在招聘中考核.NET架构师
  • ​MySQL主从复制一致性检测
  • ​数据结构之初始二叉树(3)
  • !$boo在php中什么意思,php前戏
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # 安徽锐锋科技IDMS系统简介
  • #pragma once与条件编译
  • #面试系列-腾讯后端一面
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (C)一些题4
  • (solr系列:一)使用tomcat部署solr服务
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (二十六)Java 数据结构
  • (黑马点评)二、短信登录功能实现
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (三)SvelteKit教程:layout 文件
  • (转)linux 命令大全
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .bat批处理(六):替换字符串中匹配的子串
  • .gitattributes 文件
  • .gitignore文件使用
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET中 MVC 工厂模式浅析
  • @SentinelResource详解
  • [ C++ ] STL---string类的使用指南