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

C++ list类成员函数介绍

目录

🤔list模板介绍:

🤔特点:

🤔list内存结构图解:

🤔 list的成员函数:

😊list构造函数:

🔍代码示例:

🔍运行结果:

😊list赋值函数:

🔍代码实例:

🔍运行结果:

😊list判断函数:

🔍代码实例:

运行结果:

😊 list的删除和插入

🔍代码实例:

运行结果:

😊list存取函数

🔍代码实例:

🔍运行结果:

😊 list反转和排序函数:

🔍代码实例:

🔍运行结果:

😊 list实用特殊函数:

🔍2.merge:

🔍3.cbegin,crbegin,cend,crend

结束!


🤔list模板介绍:

                        📖C++中的list是一个双向链表模板类,提供了一系列方便的链表操作方法,比如在列表前后插入/删除元素、访问节点和迭代器等。它的底层实现是双向链表、由节点构成的结构,节点包含指向前一个节点和后一个节点的指针,使得链表的查找、插入和删除操作都比较高效。与vector相比,list不支持随机访问,但提供了更快的在任意位置进行插入和删除操作能力,list一般用于动态添加或删除元素比较多的情况,例如LRU缓存中存储最近使用过的数据。

🤔特点:

📖1. 双向链表结构:list以双向链表的形式存储元素,每个节点包含一个元素值和指向前一个和后一个节点的指针。因此,在list中插入、删除元素可以较为高效地实现。

📖2. 不支持随机访问:list不支持随机访问,并不能像vector和array一样通过下标来访问节点,而需要通过迭代器或指针来操作。

📖3. 动态添加和删除元素:由于其底层为链表结构,list可以在任意位置高效地进行元素插入删除操作,而不需要移动其他元素,通过这一点,list可以用于需要频繁添加和删除元素的场景。

4. 迭代器支持:list提供了迭代器的支持,可以通过迭代器遍历整个链表,或者实现反向遍历。

📖5. 内存空间管理:list为每个元素分配堆空间,因此不同于vector,list对元素的添加或删除操作能够避免因为内存重分配带来的性能损失。

📖6. 没有实现数据的置换list中不包含像set和map这些关联式容器实现的数据置换机制。如果需要实现数据的置换,可以使用其他关联式容器,例如红黑树,AVL树等。

📖7. list迭代器不支持加减操作:由于链表的结构和迭代器的本质,list迭代器不支持加减操作,例如it = it + 1,但支持递增和递减,例如++it和--it。

总的来说,list能够高效实现插入或删除元素,并可以通过迭代器遍历整个链表。由于需要为每个元素分配堆空间,因此list也会占用比vector更多的内存空间。

🤔list内存结构图解:

🤔 list的成员函数:

😊list构造函数:

📖1.默认构造函数:list <T>   lst;

list<int>b;

📖2..将[beg,end)区间的元素拷贝给自身 : list(beg,end);

list<int>c(b.begin(),b.end());

📖3.将n个elem拷贝给本身: list(n,elem);

list<int>d(8,10);

📖4.拷贝构造函数  list (const list &list);

list<int>d(8,10);

🔍代码示例:

#include<iostream>
using namespace std;
#include<list>
void printa(const list<int>& d)
{for (list<int>::const_iterator it = d.begin(); it != d.end(); it++){cout << *it << "  ";}cout << endl;
}
void test01()
{//默认构造为:list<int>b;for (int i = 0; i < 10; i++){b.push_back(i);}cout << "默认构造结果为:";printa(b);//区间构造为:list<int>c(b.begin(),b.end());cout << "区间构造结果为:";printa(c);//n个elem构造:list<int>d(8,10);cout << "n个elem构造结果为:";printa(d);//拷贝构造:list<int>e(d);cout << "赋值构造结果为:";printa(e);}
int main()
{test01();
}

🔍运行结果:

😊list赋值函数:

📖1.将[beg,end)区间中的数据拷贝赋值给本身:   assign(beg,end);

b1.assign(b.begin(), b.end());

📖2.将n个elem赋值给本身:     assign(n,elem) ;

b2.assign(10, 8);

📖3.重载等号运算符:     list & opertor =(const list &list );

list<int>b3;
b3 = b2;

📖4.将list与本身元素互换:    swap();

list<int>b4;b4.swap(b3);

🔍代码实例:

#include<iostream>
using namespace std;
#include<list>
void printa(const list<int>& d)
{for (list<int>::const_iterator it = d.begin(); it != d.end(); it++){cout << *it << "  ";}cout << endl;
}
void test01()
{//默认构造为:list<int>b;for (int i = 0; i < 10; i++){b.push_back(i);}cout << "默认构造结果为:";printa(b);list<int>b1;b1.assign(b.begin(), b.end());cout << "区间拷贝结果为:";printa(b1);list<int>b2;b2.assign(10, 8);cout << "区间拷贝结果为:";printa(b1);list<int>b3;b3 = b2;cout << "重载等号结果为:";printa(b3);list<int>b4;b4.swap(b3);cout << "交换后结果为:";printa(b4);
}
int main()
{test01();
}

🔍运行结果:

😊list判断函数:

📖1返回容器中的元素个数:    size()
📖2.返回容器是否为空:     empty()
📖3.重新指定容器的长度为num。若容器变长,就以默认值填充新位置,若容器变短,则超出的被删除:        resize(num);
📖4.重新指定容器的长度为num。若容器变长,就以ele值填充新位置,若容器变短,则超出的被删除:       resize(num,elem);

🔍代码实例:

 #include<iostream>
using namespace std;
#include<list>
void printa(const list<int>& d)
{for (list<int>::const_iterator it = d.begin(); it != d.end(); it++){cout << *it << "  ";}cout << endl;
}
void test01()
{//默认构造为:list<int>b;for (int i = 0; i < 10; i++){b.push_back(i);}cout << "默认构造结果为:";printa(b);cout << "b容器是否为空(1为空,0不为空)" << b.empty()<<endl;cout << "b容器的大小为:" << b.size()<<endl;b.resize(11);cout << "无ele的resize结果为:";printa(b);cout << endl;b.resize(12,9);cout << "有ele的resize结果为:";printa(b);}
int main()
{test01();
}

运行结果:

😊 list的删除和插入

📖1.在容器尾部加入一个容器                               push_back(elem);

📖2.删除容器中最后一个元素                               pop_back();

📖3.在容器开头插入元素                                      push_front(ele);

📖4.删除第一个元素                                              pop_front();

📖5.在pos位置插入                                                eleminsert(pos, elem);

📖6.在pos位置插入n个eleminsert                       (pos,n, elem);

📖7.在pos位置插入区间beg,end的所有元素        insert(pos,beg,end);

📖8.移除容器中的所有元素                                    clear();

📖9.删除beg到end的所有元素                                earse(beg, end);

📖10.删除pos位置的数据                                         earse(pos);

📖11.删除容器中所有与ele匹配的值                       remove(ele);

🔍代码实例:

 #include<iostream>
using namespace std;
#include<list>
void printa(const list<int>& d)
{for (list<int>::const_iterator it = d.begin(); it != d.end(); it++){cout << *it << "  ";}cout << endl;
}
void test01()
{//默认构造为:list<int>b;for (int i = 0; i < 10; i++){b.push_back(i);}cout << "默认构造结果为:";printa(b);b.push_back(1);cout << "在尾部插入数字后:";printa(b);b.pop_back();cout << "在尾部删除数字后:";printa(b);b.push_front(1);cout << "在头部插入数字后:";printa(b);b.pop_front();cout << "在头部删除数字后:";printa(b);b.insert(b.begin(), 98);cout << "在头部插入数字98后:";printa(b);b.insert(b.begin(), 3,98);cout << "在头部插入3个数字98后:";printa(b);b.clear();cout << "在使用clear函数后:";printa(b);//重新赋值:for (int i = 0; i < 10; i++){b.push_back(i);}b.remove(8);cout << "在使用参数为8的remove函数后";printa(b);b.erase(b.begin());cout << "使用erase函数对begin位置删除后";printa(b);b.erase(b.begin(),b.end());cout << "使用erase函数对begin到end区间删除后";printa(b);}
int main()
{test01();
}

运行结果:

😊list存取函数

📖1.返回第一个元素:front()
📖2.返回最后一个元素:back()

🔍代码实例:

 #include<iostream>
using namespace std;
#include<list>
void printa(const list<int>& d)
{for (list<int>::const_iterator it = d.begin(); it != d.end(); it++){cout << *it << "  ";}cout << endl;
}
void test01()
{//默认构造为:list<int>b;for (int i = 0; i < 10; i++){b.push_back(i);}cout << "默认构造结果为:";printa(b);cout << "打印front函数的返回值:";cout << b.front();cout << endl;cout << "打印back函数的返回值:";cout << b.back();
}
int main()
{test01();
}

🔍运行结果:

😊 list反转和排序函数:

📖1.反转链表 reverse();
📖2.排序  sort();

🔍代码实例:

 #include<iostream>
using namespace std;
#include<list>
void printa(const list<int>& d)
{for (list<int>::const_iterator it = d.begin(); it != d.end(); it++){cout << *it << "  ";}cout << endl;
}
void test01()
{//默认构造为:list<int>b;for (int i = 0; i < 10; i++){b.push_back(i);}cout << "默认构造结果为:";printa(b);cout << "调用reverse函数之后";b.reverse();printa(b);cout << endl;cout << "调用sort函数之后:";b.sort();printa(b);
}
int main()
{test01();
}

🔍运行结果:


 

😊 list实用特殊函数:

🔍1.unique

📖在C++ STL的list容器中,unique是一个函数,它用于去除list容器中邻近并且相等的元素,时间复杂度为O(N),其中N为list容器大小。

template<class T> void list<T>::unique();

📖该函数检查容器中相邻的元素,并删除重复的元素。

📖举个例子,如果list容器中包含如下元素:{1, 2, 2, 3, 3, 3},那么如果你调用unique函数,它将会把容器变为:{1, 2, 3},即将每个相邻并且相等的元素删除并仅保留一个。

📖需要注意的是,在使用unique函数之前必须将list容器进行排序,因为该函数仅能识别相邻、相等的元素,如果元素未排序,它将无法正确地识别相邻的元素是否相等。

📖如果需要自定义去重的判定条件,可以将自定义的判断函数作为参数传递给unique函数,这样它可以根据自定义规则去重。例如:

bool compare(int a, int b) {return abs(a) < abs(b);
}int main() {std::list<int> mylist { 1, 2, -2, 3, -3, -3 };mylist.sort();mylist.unique(compare);for (auto it=mylist.begin(); it!=mylist.end(); ++it)std::cout << ' ' << *it;return 0;
}

📖该代码使用自定义比较函数compare(),它将每个元素的绝对值作为比较条件,去除相邻的绝对值相等的元素,输出结果为1 2 3

🔍2.merge:

📖在C++ STL的list容器中,merge()函数用于将两个已排序的list容器合并为单个list,并保持其排序顺序。该函数的用法如下:

template<class T> void list<T>::merge(list<T>& x);

📖该函数将x的元素合并到当前容器中,并确保保持排序顺序。

📖举个例子,如果有两个list容器,分别为:

std::list<int> list1 { 1, 3, 5 };
std::list<int> list2 { 0, 2, 4 };

📖如果你对它们进行merge()操作,那么list2中的元素将被移动到list1容器中,并保持排序顺序,最终list1容器变为:{0, 1, 2, 3, 4, 5}。

📖需要注意的是,在使用merge()函数之前必须将list容器进行排序,否则结果将是未定义的

🔍3.cbegin,crbegin,cend,crend

📖cbegin() 和 cend() 返回指向容器中第一个元素最后一个元素的常量迭代器。其中,最后一个元素指的是那个值与 list::end() 的返回值相等的元素的下一个位置。这些函数的返回类型是 const_iterator,这意味着它们返回的迭代器是指向常量值的。

📖而 crbegin() 和 crend() 则返回指向容器中最后一个元素和第一个元素的常量反向迭代器。这些函数的返回类型是 const_reverse_iterator

结束!

相关文章:

C++ list类成员函数介绍

目录 &#x1f914;list模板介绍&#xff1a; &#x1f914;特点&#xff1a; &#x1f914;list内存结构图解&#xff1a; &#x1f914; list的成员函数&#xff1a; &#x1f60a;list构造函数&#xff1a; &#x1f50d;代码示例&#xff1a; &#x1f50d;运行结果&…...

【服务器】本地搭建PHP简单Imagewheel私人云图床

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…...

第四十二回:DateRangePickerDialog Widget

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了DatePickerDialog Widget相关的内容,本章回中将介绍 DateRangePickerDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的DateRangePickerDialog是一种弹出窗口&#xff0c;只不…...

【C++系列P3】‘类与对象‘-三部曲——[基础知识](1/3)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 C系列 &#xff0c;热烈欢迎&#xff01; 【 类与对象-三部曲】的大纲主要内容如下&#xff1a; 如标题所示&#xff0c;本章是【 类与对象-三部曲】三章中的第一章节——基础知识章节&#xff0c;主要内容如下&#xff1a; 目录 一.…...

Android UEvent事件分析之Kernel上报电量

kernel-4.4\drivers\power\power_supply_core.c 当电量信息需要更新的时候,kernel会调用power_supply_changed_work这个工作队列,使用kobject_uevent函数往上发送uevent事件,action是KOBJ_CHANGE; static void power_supply_changed_work(struct work_struct *work) {uns…...

C++ vector模板和deque的简单应用

目录 &#x1f914;vector模板和deque的简单介绍: &#x1f914;vector和deque的主要不同之处&#xff1a; &#x1f914;今天我们用vector模板和deque模板实现以下简单的功能&#xff1a; 代码实现&#xff1a; &#x1f914;讲解&#xff1a; &#x1f914;vector模板和d…...

声明式事务控制

声明式事务控制 编程式事务控制相关对象 PlatformTransactionManager PlatformTransactionManager接口是spring的事务管理器&#xff0c;它里面提供了常用的操作事务的方法 方法说明TransactionStatus getTransaction(TransactionDefaultion defination)获取事务的状态信息…...

cisp pte模拟题

1.信息搜集 本题共三个key 端口 1433 27689 存活ip 192.168.85.137 2.访问网站27689进行信息搜集 一个登录框&#xff0c;sql注入失败&#xff0c;暴力破解失败 扫描目录 发现三个文件robots.txt ,web.config 除了robots.txt,其他都访问不了 访问robots.txt,发现一个file参数…...

Docker容器 和 Kubernetes容器集群管理系统

一、快速了解Docker 1. 什么是Docker的定义 Docker 是一个开源的应用容器引擎&#xff0c;基于Go语言并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以…...

港联证券|资金疯狂涌入AI,这一板块涨幅超90%!万亿巨头继续狂飙

国内外资金继续加码AI概念股。 当前&#xff0c;国内政策层面对于通用人工智能和算力中心的创新发展扶持政策不断推出&#xff0c;资本市场对于AI&#xff08;人工智能&#xff09;热情不断升温。在AI下游应用中&#xff0c;游戏板块成为最被看好的投资标的&#xff0c;资金流入…...

短视频矩阵系统源码-开源开发php语言搭建

短视频矩阵系统源码---------- php源码是什么&#xff1f; PHP源码指的就是PHP源代码&#xff0c;源代码是用特定编程语言编写的人类可读文本&#xff0c;源代码的目标是为可以转换为机器语言的计算机设置准确的规则和规范。因此&#xff0c;源代码是程序和网站的基础。 PHP…...

PFEA112-20 3BSE050091R20 张力控制器

您的张力测量系统包括&#xff1a; 张力电子PFEA111或PFEA112–PFEA111是一款经济高效的紧凑型用户友好型张力电子产品&#xff0c;提供 来自两个称重传感器的精确可靠的快速模拟SUM信号&#xff0c;用于控制 和/或监测。显示器可以显示SUM、单个A&B和差异信号小尺寸和DIN导…...

Java springboot+vue生成报纸排版页面的新闻官网

实现方案&#xff0c;可以作为您开始开发的参考&#xff1a; 后端&#xff1a; 使用Spring Boot框架构建Java Web应用&#xff1b;使用MyBatis Plus进行ORM映射&#xff0c;管理MySQL数据库&#xff1b;按照需求定义新闻数据表、类别数据表和用户数据表&#xff0c;使用默认的…...

Terra-Luna归零一年后:信任重建、加密未来路在何方?

本月既是Terra-Luna归零的一周年&#xff0c;也是FTX崩溃的第六个月&#xff0c;而这两个事件分别代表着2022年加密市场连环爆的开始与高潮&#xff0c;引发了加密行业15年历史上最可怕的生存危机。 尽管今年市场行情有所回暖&#xff0c;比特币开年至今涨幅70%&#xff0c;以太…...

Android 12.0 手动安装Persistent app失败的解决方案

1.概述 在12.0的系统产品开发中,对于一些安装app的失败问题,需要看日志 和抛出异常来判断问题所在,在最近的一些app安装失败抛出了关于Presistent app安装失败的问题,就需要从PMS安装的过程中看异常抛出的原因解决问题所在 2.手动安装Persistent app失败的解决方案的核心类…...

Unity3D安装:从命令行安装 Unity

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 从命令行安装 Unity 如果要在组织中自动部署 Unity&#xff0c;可以从命令行安装 Editor 和其他组件。这些组件是普通的安装程序可执行程序和软件包&#xff0c;可以给用来自动部署…...

C++模板(详解)

非类型模板参数 模板参数可分为类型形参和非类型形参。类型形参&#xff1a; 出现在模板参数列表中&#xff0c;跟在class或typename关键字之后的参数类型名称。非类型形参&#xff1a; 用一个常量作为类&#xff08;函数&#xff09;模板的一个参数&#xff0c;在类&#xff…...

WuThreat身份安全云-TVD每日漏洞情报-2023-05-25

漏洞名称:Mitsubishi Electric MELSEC iQ-F 数据包缓冲区溢出 漏洞级别:严重 漏洞编号:CVE-2023-1424 相关涉及:Mitsubishi Electric Corporation MELSEC iQ-F Series CPU 漏洞状态:未定义 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-12805 漏洞名称:Ap…...

android 12.0去掉recovery模式UI页面的选项

1.概述 在12.0进行定制化开发,会根据需要去掉recovery模式的一些选项 就是在device.cpp去掉一些选项就可以了 2.去掉recovery模式UI页面的选项核心代码 bootable/recovery/recovery_ui/device.cpp bootable/recovery/recovery_main.cpp 3.去掉recovery模式UI页面的选项的核…...

C++ vector类成员函数介绍

目录 &#x1f914;vector模板介绍&#xff1a; &#x1f914;特点&#xff1a; &#x1f914;vector的成员函数&#xff1a; &#x1f50d;vector构造函数&#xff1a; &#x1f50d;vector赋值函数 &#x1f50d;vector容器的判断函数 resize函数的重点内容&#xff1a; …...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...