【C++】list的基本使用

💗个人主页💗
⭐个人专栏——C++学习⭐
💫点击关注🤩一起学习C语言💯💫

目录

导读

1. list基本介绍

2. list构造函数

3. list迭代器

4. list容量

5. list的修改操作

6. list排序


导读

今天我们来正式学习list,了解它的一些基本使用方法。我们在之前C语言的数据结构部分,有讲过单链表和双向循环链表,有兴趣的小伙伴可以点进专栏看一下。

1. list基本介绍

C++中的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构造函数

在C++中,可以使用不同的构造函数来创建list对象。  

1. 默认构造函数:

使用默认构造函数创建一个空的list对象。

	std::list<T> myList;

2. 复制构造函数:

使用另一个list对象otherList创建一个新的list对象,并复制所有元素。

std::list<T> myList(otherList);

3. 范围构造函数:

使用指定范围内的元素创建一个新的list对象。firstlast是指向范围内第一个元素和最后一个元素的迭代器。

std::list<T> myList(first, last);

4. 初始化列表构造函数:

使用初始化列表中的值来创建一个新的list对象。

std::list<T> myList = {val1, val2, val3, ...};

示例:

int main() 
{
    // 默认构造函数
    list<int> myList1;

    // 复制构造函数
    list<int> myList2(myList1);

    // 范围构造函数
    list<int> myList3(myList1.begin(), myList1.end());

    // 初始化列表构造函数
    list<int> myList4 = { 1, 2, 3, 4, 5 };

    // 遍历list并打印所有元素
    for (int num : myList4) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

3. list迭代器

list容器提供了双向迭代器(bidirectional iterators),可以用于遍历和操作容器中的元素。list的迭代器支持前进(++)和后退(--)操作,并且可以跳转到任意位置。

以下是一些常用的list迭代器操作:

  1. begin():返回指向第一个元素的迭代器。
  2. end():返回指向最后一个元素之后位置的迭代器。
  3. rbegin():返回指向最后一个元素的逆向迭代器。
  4. rend():返回指向第一个元素之前位置的逆向迭代器。

示例: 

int main() 
{
    list<int> myList = { 1, 2, 3, 4, 5 };

    // 正向迭代器遍历list
    cout << "正向遍历list: ";
    list<int>::iterator itr;
    for (itr = myList.begin(); itr != myList.end(); ++itr) 
    {
        cout << *itr << " ";
    }
    cout << endl;

    // 逆向迭代器遍历list
    cout << "逆向遍历list: ";
    list<int>::reverse_iterator ritr;
    for (ritr = myList.rbegin(); ritr != myList.rend(); ++ritr) 
    {
        cout << *ritr << " ";
    }
    cout << endl;

    return 0;
}

4. list容量

使用size()函数来获取容器的大小。

empty()函数返回一个bool类型的值,如果容器为空,则返回true;否则返回false

int main() 
{
    std::list<int> myList = { 1, 2, 3 };

    cout << "容器大小:" << size(myList) << endl;
    if (myList.empty()) 
    {
        cout << "容器为空" << endl;
    }
    else 
    {
        cout << "容器不为空" << endl;
    }

    myList.clear();
    cout << "容器大小:" << size(myList) << endl;

    if (myList.empty()) 
    {
        cout << "容器为空" << endl;
    }
    else 
    {
        cout << "容器不为空" << endl;
    }

    return 0;
}

5. list的修改操作

list是一种双向链表容器,提供了多种修改容器的操作函数。下面是一些常见的list的修改操作函数:

1. 添加元素:

  • 使用push_back(element)函数将元素添加到列表的末尾。
  • 使用push_front(element)函数将元素添加到列表的开头。
  • 使用insert(iterator, element)函数在指定的迭代器位置之前插入元素。

2. 删除元素:

  • 使用pop_back()函数删除列表的最后一个元素。
  • 使用pop_front()函数删除列表的第一个元素。
  • 使用erase(iterator)函数删除指定迭代器位置的元素。
  • 使用erase(start_iterator, end_iterator)函数删除指定范围内的元素。

3. 修改元素:

  • 使用迭代器操作符*来直接修改列表中的元素。

 

int main() 
{
    list<int> my_list = { 1, 2, 3 };

    // 添加元素
    my_list.push_back(4);
    my_list.push_front(0);
    auto it = my_list.insert(++my_list.begin(), 5);
    for (auto e : my_list)
    {
        cout << e << " ";
    }
    cout << endl;

    // 删除元素
    my_list.pop_back();
    my_list.pop_front();
    my_list.erase(it);

    for (auto e : my_list)
    {
        cout << e << " ";
    }
    cout << endl;

    // 修改元素
    *++my_list.begin() = 6;

    // 打印列表元素
    for (const auto& elem : my_list) 
    {
        cout << elem << " ";
    }
    cout << endl;

    return 0;
}

6. list排序

在C++中,可以使用list容器的sort()成员函数对列表进行排序。sort()函数会根据元素的默认比较函数(operator<)来进行排序。如果列表中的元素是自定义类型,可以通过在类中重载小于操作符(operator<)来定义自定义的比较方式。

int main() 
{
    list<int> my_list = { 5, 2, 8, 1, 4 };

    // 对列表进行升序排序
    my_list.sort();

    // 打印排序后的列表
    for (const auto& elem : my_list) 
    {
        cout << elem << " ";
    }
    cout << endl;

    // 对列表进行降序排序
    my_list.sort(greater<int>());

    for (const auto& elem : my_list)
    {
        cout << elem << " ";
    }
    cout << endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/687695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业该如何选择GPU云服务器配置?

无论是个人开发者还是企业用户&#xff0c;对于如何选购最佳的云服务器配置&#xff0c;都是比较头疼与纠结的。因为GPU云服务器的配置众多&#xff0c;各种组合有各自优势与用途&#xff0c;很难一下子做出决策。接下来&#xff0c;我们来简单分析下各配置应该怎么选购。 1、地…

k8s和deepflow部署与测试

Ubuntu-22-LTS部署k8s和deepflow 环境详情&#xff1a; Static hostname: k8smaster.example.net Icon name: computer-vm Chassis: vm Machine ID: 22349ac6f9ba406293d0541bcba7c05d Boot ID: 605a74a509724a88940bbbb69cde77f2 Virtualization: vmware Operating System: U…

红海边的这座城,如何点亮人类可持续发展之梦

导读&#xff1a;造一座100%清洁能源供电的城市&#xff1f; 城市是人类最伟大的成就之一&#xff0c;数千年来城市承载了人类文明的跃迁。21世纪&#xff0c;在人类追求可持续发展的蓝图中&#xff0c;城市有了新的使命。 容纳全球50%以上人口&#xff0c;但碳排放量超过70%的…

植物大战僵尸杂交版 2.0 下载及配置图文教程

文章目录 Part.I IntroductionPart.II 下载Chap.I 下载地址Chap.II 网盘直链下载 Part.III 配置Chap.I 解压与安装Chap.II 加载存档Chap.III 其他设置 Reference Part.I Introduction 最近看大仙儿直播植物大战僵尸&#xff0c;觉得挺好玩的。它大概长这样&#xff1a; 就上网…

怎么取消Intellij IDEA中的项目和Git仓库的关联

这篇文章分享一种最简单的方法&#xff0c;取消已经开启代码控制的项目与git代码仓库的关联。 打开项目的位置&#xff0c;然后点击文件管理器上方的查看选项卡&#xff0c;勾选【隐藏的项目】。 然后可以看到项目的文件夹下显示了一个隐藏的.git文件夹&#xff0c;直接把这个.…

英伟达Blackwell芯片正式投入生产 | 百能云芯

在近日的一场公开活动中&#xff0c;英伟达公司的创始人和首席执行官黄仁勋正式宣布&#xff0c;备受瞩目的Blackwell芯片已成功投产。 黄仁勋在讲话中强调&#xff0c;英伟达将继续坚持其数据中心规模、一年节奏、技术限制、一个架构的战略方向。这意味着英伟达将继续运用业界…

一个简单好用的 C# Animation Easing 缓动动画类库

文章目录 1.类库说明2.使用步骤2.1 创建一个Windows Form 项目2.2 安装类库2.3 编码2.4 效果 3.该库支持的缓动函数4.代码下载 1.类库说明 App.Animations 类库是一个很精炼、好用的 csharp easing 动画库 基于 net-standard 2.0提供 Fluent API&#xff0c;写代码非常舒服。…

项目3:从0开始的RPC框架

一. 基本概念 区别于传统的增删改查型的业务项目&#xff0c;本项目侧重于开发框架&#xff0c;并且涉及架构方面的技术知识点。 1. 什么是RPC&#xff1f; 远程过程调用&#xff08;Remote Procedure Call&#xff09;&#xff0c;是一种计算机通信协议&#xff0c;它允许程…

02眼电识别眼动--软件V1.0

对应视频链接点击直达 01项目点击下载&#xff0c;可直接运行&#xff08;含数据库&#xff09; 02眼电识别眼动--软件V1.0 对应视频链接点击直达构思结语其他以下是废话 构思 对于软件&#xff0c;主要就是接收数据、处理数据、储存和显示数据。 这是主要页面&#xff0c;…

爬取股票数据python

最近在搜集数据要做分析&#xff0c;一般的数据来源是一手数据&#xff08;生产的&#xff09;和二手数据&#xff08;来自其他地方的&#xff09;。 今天我们爬取同花顺这个网站的数据。url为&#xff1a;https://data.10jqka.com.cn/ipo/xgsgyzq/ 话不多说直接上代码。有帮…

QT项目实战: 五子棋小游戏

目录 内容介绍 一.添加头文件 二.画棋盘 1.宏定义 2.棋盘 三.画棋子 四.获取棋子摆放位置 五.判断棋子存在 六.判断胜利 1.变量定义和初始化 2.检查获胜条件 3.游戏结束处理 七.重绘 八.效果展示 九.代码 1.mainwindow.h 2.mainwindow.cpp 3.chessitem.h 4…

部署kubesphere报错

安装kubesphere报错命名空间terminted [rootk8smaster ~]# kubectl apply -f kubesphere-installer.yaml Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16, unavailable in v1.22; use apiextensions.k8s.io/v1 CustomResourceDefini…

【Oracle篇】rman全库异机恢复:从单机环境到RAC测试环境的转移(第五篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

车载以太网测试要测些什么呢?

车载以太网测试大致可以分成两块&#xff1a;TC8测试和以太网通信测试。 TC8测试全称TC8一致性测试&#xff0c;其规范由OPEN联盟制定&#xff0c;包括车载以太网ECU从物理层到应用层的各层互操作性以及常规基础功能服务。目的在于提高不同ECU之间的兼容性。 TC8测试规范可以…

C++STL---stack queue知识汇总

前言 C将stack和queue划归到了Containers中&#xff0c;但严格的说这并不准确&#xff0c;stack和queue实际上已经不再是容器了&#xff0c;而是属于容器适配器&#xff0c;适配器做的功能是转换&#xff0c;即&#xff1a;它不是直接实现的&#xff0c;而是由其他容器封装转换…

ruoyi若依二次开发怎么添加扫描自己的controller和mapper,配置三个地方即可。

概要 首先&#xff0c;添加在com.ruoyi外的类&#xff0c;项目启动后&#xff0c;调用接口&#xff0c;是会返回404找不到的。 必须要对这以外的接口类进行配置。目录结构如下&#xff1a; 解决步骤 一、添加 com.ruoyi.framework.config 下&#xff1a; // 指定要扫描的M…

深度学习革命-AI发展详解

深度学习革命 《深度学习革命》是一部引人深思的作品&#xff0c;详细讲述了深度学习技术的发展历程及其对各个行业的深远影响。由杰出的计算机科学家、深度学习专家撰写&#xff0c;这本书不仅适合科技领域的专业人士阅读&#xff0c;也为普通读者提供了一个理解人工智能革命…

LeetCode322.零钱兑换

文章目录 题目描述解题思路递归记忆化搜索动态规划另一种实现 题目描述 https://leetcode.cn/problems/coin-change/description/?envTypestudy-plan-v2&envIdtop-interview-150 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount …

考研规划,这么学上岸率比985的学霸还高!

我觉得985考研上岸率低是可以理解的 因为大家本科能考上985&#xff0c;那研究生大概率会报考和本学校差不多或者更高水平的院校&#xff0c;甚至清华北大都有人敢报&#xff0c;去实现自己本科没有实现的梦想。 而且985其实保研的比例很高&#xff0c;一般有30%的保研比例了…

亚马逊测评自养号技术全攻略:一站式解决方案

在跨境电商这行&#xff0c;产品测评可是个大问题。如果你的商品销量少&#xff0c;评价也不多&#xff0c;那买家就很难注意到你的产品&#xff0c;更别提下单购买了。毕竟&#xff0c;大家都喜欢跟风买那些已经有很多人好评的产品&#xff0c;而不是冒险尝试一个全新的。 我们…