C++容器:list(双向链表)

一丶list介绍

C++中的list容器底层确实是以双向链表的形式实现的

  list容器是C++标准模板库(STL)中的一部分,它提供了对列表数据结构的实现。

  • 双向链表结构list容器的每个元素都是通过指针链接在一起的,每个元素都包含指向前一个和后一个元素的指针。这种双向链表的结构使得在list容器中插入和删除元素时无需移动其他元素,因此这些操作的时间复杂度为O(1)。
  • 内存分配:由于list容器基于双向链表,其元素可以分散存储在内存中,不需要像数组或vector那样连续分配内存空间。这使得list在内存使用上更加灵活,特别适合于需要频繁插入和删除操作的场景。
  • 迭代器稳定性list容器的迭代器在插入和删除操作中保持稳定性,即使在进行这些操作时,指向其他元素的迭代器也不会失效。

二丶list的使用

       C++中list容器提供了多种用于操作列表的函数,使得对元素的插入、删除和访问变得灵活而高效。以下是一些常用的list容器函数:

  • push_back():在列表的尾部插入一个新元素。
  • push_front():在列表的头部插入一个新元素。
  • pop_back():删除列表尾部的元素。
  • pop_front():删除列表头部的元素。
  • size():返回列表中元素的个数。
  • empty():判断列表是否为空,如果为空则返回true,否则返回false。
  • clear():清除列表中的所有元素。
  • erase():删除列表中的一个或多个元素。
  • remove():移除列表中所有等于特定值的元素。
  • sort():对列表中的元素进行排序。
  • reverse():反转列表中元素的顺序。
#include<iostream>
#include<list>
using namespace std;
template<class T>
void PrintList(const list<T>& l)  //打印函数
{auto it = l.begin();while (it != l.end()){cout << *it << " ";it++;}cout << endl;
}
void ListTest()
{list<int> l;    //空l.push_back(1);   //尾插l.push_back(2);l.push_back(3);PrintList(l);list<int> _l(l);  //构造函数重载PrintList(_l);_l.clear();l.push_front(4);  //头插l.push_front(5);l.push_front(6);PrintList(l);l.sort();   //排序PrintList(l);l.pop_back();  //尾删l.pop_back();PrintList(l);l.pop_front();  //头删l.pop_front();PrintList(l);
}
int main()
{ListTest();return 0;
}

 

        这些用法其实很简单,主要还是要学会灵活使用。这里要注意一下sort函数,默认是升序函数

底层使用的一般是快速排序算法,然后sort重载了另一个函数,这里的Compare 是用来控制升序或者降序的,称为仿函数

std::list::sort(1)	void sort();(2)	
template <class Compare>void sort (Compare comp);

      如下,MyCompare 只重载了运算符(),然后我们自己写了一个sort,调用的是std::sort,std::sort(迭代器1,迭代器2,仿函数),不传仿函数就调用另一个重载函数将迭代器范围内升序排序

struct MyCompare {bool operator()(int a, int b) {return a > b; // 降序排列}
};template <class ForwardIt, class Compare>
void sort(ForwardIt first, ForwardIt last, Compare comp) {// ... 其他代码 ...while (first != last) {// ... 其他代码 ...// 使用comp比较函数对象比较两个元素if (comp(*i, *j)) {// ... 其他代码 ...} else {// ... 其他代码 ...}// ... 其他代码 ...}// ... 其他代码 ...
}

三丶与vector比较

  1. 内存分配:

    • vector:在内存中连续存储元素,当需要添加或删除元素时,可能会导致整个容器的内存重新分配。
    • list:在内存中非连续存储元素,每个元素都是一个单独的节点,包含数据和指向前后节点的指针。因此,添加或删除元素时,只需要修改相邻节点的指针,不会影响其他元素的内存位置。
  2. 访问方式:

    • vector:支持随机访问,可以直接通过索引访问任何元素,访问速度快。
    • list:不支持随机访问,只能通过迭代器进行顺序访问。
  3. 插入和删除操作:

    • vector:在尾部插入和删除元素的效率高,因为不需要移动其他元素;而在中间或头部插入和删除元素效率较低,因为需要移动其他元素。
    • list:在任何位置插入和删除元素的效率都较高,因为只需要修改相邻节点的指针。
  4. 容量和大小:

    • vector:有固定的容量,可以容纳的元素数量有限。当超过容量时,会自动扩容,可能会引起内存重新分配和元素移动。
    • list:没有固定容量的概念,只要内存允许,可以不断地添加新元素。
  5. 性能:

    • vector:在内存中连续存储,有利于缓存的利用,因此访问速度较快。但在插入和删除操作时可能需要移动大量元素,效率较低。
    • list:在内存中非连续存储,不利于缓存的利用,访问速度较慢。但在插入和删除操作时只需要修改指针,效率较高。

    总之,vectorlist各有优缺点,具体使用哪个容器取决于具体的应用场景和需求。如果需要频繁访问元素,可以选择vector;如果需要频繁插入和删除元素,可以选择list

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年中国国际厨卫家居展览会(上海KIB厨卫展)

中国国际厨卫家居博览会&#xff08;KIB&#xff09;由中国五金制品协会、中国国际贸易促进委员会轻工行业分会、北京奥维云网大数据科技股份有限公司主办。从最初的“中国国际橱柜、厨房卫浴产品与技术博览会(CIKB&#xff09;”&#xff0c;到2001年与中国国际五金展&#xf…

【2024系统架构设计】回顾历史,查缺补漏篇 ③

前言 hello,大家好: 💡💡💡 我们一起来备考软考高级系统架构设计师吧,本专栏提供综合知识、案例科目、论文(论点和部分示例范文)等内容,包括知识点总结和记忆小妙招哦。 🚀🚀🚀 可以减少资料查找和收集的时间,提高效率,我们一起集中精力学习干货吧! 💡…

k8s二进制部署--多master、负载均衡、高可用

目录 1、环境准备 1.1 服务器配置 1.2 master02 节点部署 2、负载均衡部署 2.1 下载nginx 2.2 修改nginx配置文件 2.3 启动nginx 2.3.1 检查配置文件语法 2.3.2 启动nginx服务&#xff0c;查看已监听6443端口 3. 部署keepalived服务(nginx主机&#xff0c;以nginx01为…

[ROS 系列学习教程] 建模与仿真 - URDF 建模实践

ROS 系列学习教程(总目录) 本文目录 一、机器人结构组成二、新建功能包三、编写launch文件四、创建底盘五、添加轮子六、添加其他部件七、解决部分实体位于地面以下的问题 前文介绍了URDF建模与URDF语法&#xff0c;接下来介绍怎么使用URDF从零构建一个机器人模型并在rviz中显示…

基于国产LoRa的智慧农业解决方案--ASR6601、SX1278

我国《数字乡村发展战略纲要》明确指出“要推进农业数字化转型”&#xff0c;加快推广云计算、大数据、物联网、人工智能在农业生产经营管理中的运用。 然而&#xff0c;目前我国的农业数字化转型还面临着诸多挑战。我国整体农业机械化程度和自动化控制水平仍然较低。由于农田面…

Java类和对象(二)—— 封装,static 关键字与代码块

前言 在面向对象的编程语言中&#xff0c;有三大特性&#xff1a;封装、继承和多态~~ 今天我们就来学习封装的知识 封装 什么是封装 在现实生活中&#xff0c;我们经常使用手机来进行沟通与交流&#xff0c;实际上我们拿到的手机是被封装好的&#xff0c;精美的屏幕&a…

java医院信息系统HIS源码SaaS模式Java版云HIS系统 接口技术RESTful API + WebSocket + WebService

java医院信息系统HIS源码SaaS模式Java版云HIS系统 接口技术RESTful API WebSocket WebService 云HIS是基于云计算的医疗卫生信息系统&#xff08;Cloud-Based Healthcare Information System&#xff09;&#xff0c;它运用云计算、大数据、物联网等新兴信息技术&#xff0c;…

jiebaNET中文分词器

最近我接手了一个有趣的需求&#xff0c;需要对用户评价进行分词&#xff0c;进行词频统计和情绪分析&#xff0c;并且根据词频权重制成词云图以供后台数据统计&#xff0c;于是我便引入了jieba分词器,但是我发现网上关于jiebaNET相关文档实在太少了&#xff0c;甚至连配置文件…

core.sshd.xxxxxx文件过大

背景 【紧急】【应用分组】应用: 接入点服务, 分组: 观众预发, ip: xx.xx.xx.xx 【/】&#xff0c;磁盘使用率已连续2次大于90% [当前值:100%]。报警时间: 2024-05-13 14:07:01 原因 登录机器查看&#xff0c;发现根目录下有大量的崩溃文件将 / 打满 处理 1&#xff0c; 删…

百度百舸 AIAK-LLM 的大模型训练和推理加速实践

本文整理自 4 月 16 日的 2024 百度 Create 大会的公开课分享《百舸 AIAK-LLM&#xff1a;大模型训练和推理加速实践》。 今天要分享的主题是 AI Infra 相关的内容&#xff0c;主要内容分为四部分。 首先和大家一起讨论大模型给基础设施带来的挑战。第二部分则是向大家介绍一个…

洗地机怎么挑?洗地机选购指南,2024洗地机测评选购攻略

在快节奏的生活中&#xff0c;繁琐的清洁工作往往令人头疼&#xff0c;随着洗地机的诞生&#xff0c;极大地简化了清洁的过程&#xff0c;洗地机凭借着它吸拖洗为一体的高效清洁特点&#xff0c;受到家庭和商业场所的广泛欢迎。那么&#xff0c;洗地机怎么挑&#xff0c;要注意…

基于Spring封装一个websocket工具类使用事件发布进行解耦和管理

最近工作中&#xff0c;需要将原先的Http请求换成WebSocket&#xff0c;故此需要使用到WebSocket与前端交互。故此这边需要研究一下WebSocket到底有何优点和不可替代性&#xff1a; WebSocket优点&#xff1a; WebSocket 协议提供了一种在客户端和服务器之间进行全双工通信的…