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

结束!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【PWN · ret2libc】[2021 鹤城杯]babyof

Linux_64的经典ret2libc题目&#xff0c;有必要好好整理总结一下其中的流程和注意点 目录 前言 一、题目重述 二、exp&#xff08;思考与理解在注释&#xff09; 三、经验总结 攻击步骤: 注意要点 四、疑问 前言 64位Linux和32位Linux确乎有着关于参数传递上的不同&a…

Java程序设计入门教程-- if 条件语句

目录 单分支选择语句&#xff08;if&#xff09; 双分支选择语句&#xff08;if…else&#xff09; 嵌套if语句 单分支选择语句&#xff08;if&#xff09; 情形 当判断条件满足时&#xff0c;执行语句体S&#xff0c;而不满足则什么都不做。 格式 if &#xff08;条件判断表…

改造万能五笔屏蔽广告

万能五笔安装后&#xff0c;在安装目录下&#xff0c;会有20几个之多的exe应用程序&#xff0c;这些程序其实和输入法关系不大&#xff0c;即使全部删除这些&#xff0c;输入法也可以照常使用&#xff0c;只是少了些配置和无用的工具。如果安排这个只是纯粹的输入法打字&#x…

Linux 上安装 PostgreSQL——Ubuntu

打开 PostgreSQL 官网 PostgreSQL: The worlds most advanced open source database&#xff0c;点击菜单栏上的 Download &#xff0c;可以看到这里包含了很多平台的安装包&#xff0c;包括 Linux、Windows、Mac OS等 。 Linux 我们可以看到支持 Ubuntu 和 Red Hat 等各个平台…

nginx快速入门

一、什么是Nginx Nginx&#xff08;engine x&#xff09;是一个轻量级高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务&#xff0c;其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上Nginx的并发能力在同类型的网页服务器中表现较好&am…

破解mysql用户的密码

假如mysql数据库中有一个 prod_blb 用户&#xff0c;你作为root管理员&#xff0c;想知道它的密码&#xff0c;又不想修改它的密码。这个时候就只能通过获取到 prod_blb 用户加密的密码进程破译 1、MYSQL加密方式 MYSQL数据库的认证密码有两种方式&#xff0c;MYSQL 4.1版本之…

matebook14安装vmware导致多屏协同失败

原因是我的matebook安装了虚拟机vmware。导致我的手机多屏协同失败。 禁用之后就可以了

华为智慧屏的四大核心功能

AI慧眼&#xff1a;1080P通话、AI健身、AI Kids 华为智慧屏搭载自动升降微光摄像头"慧眼"&#xff0c;支持1080P高清视频通话&#xff0c;支持大屏呼叫大屏、大屏呼叫手机、手机呼叫大屏. AI健身方面&#xff0c;华为智慧屏将化身你的客厅私教&#xff0c;与北京体育…

华为系统和计算机,电脑手机合二为一 华为多屏协同让电脑与手机亲密互动

随着社会的不断发展&#xff0c;上班族们的生活节奏也在不断加快&#xff0c;移动办公更是成为了人们生活中所不可缺少的一部分。无论是咖啡厅还是地铁站&#xff0c;我们总能看到上班族们忙碌的身影。 但对于广大上班族来说&#xff0c;移动办公其实是一件非常不方便的事情&am…

【Leetcode -746.使用最小花费爬楼梯 -747.至少是其他数字两倍的最大数】

Leetcode Leetcode -746.使用最小花费爬楼梯Leetcode -747.至少是其他数字两倍的最大数 Leetcode -746.使用最小花费爬楼梯 题目&#xff1a;给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择…

华为智慧屏V55升级鸿蒙2,华为智慧屏s55和v55对比参数_华为智慧屏s55和v55哪个好...

华为智慧屏s55和v55都是二款非常受欢迎的电视产品型号&#xff0c;很多人在选择这二款产品时非常的纠结&#xff0c;那么华为智慧屏s55和v55到底哪个好呢&#xff1f;一起来看看华为智慧屏s55和v55参数对比吧~ 一、华为智慧屏s55和v55对比参数 1、华为智慧屏s55参数 功能参数内…

华为智慧屏鸿蒙评测,华为智慧屏S Pro体验:告诉你鸿蒙OS有多优秀?

华为智慧屏S Pro体验&#xff1a;告诉你鸿蒙OS有多优秀&#xff1f; 2021年03月03日 21:24作者&#xff1a;网络编辑&#xff1a;王动 分享 从华为这些年的产品发展路线可以看得出&#xff0c;物联网产品体系组建是华为未来的重点方向。而“电视”是物联网体系中重要的一环&…

华为智慧屏鸿蒙应用,华为智慧屏S Pro体验:告诉你鸿蒙OS有多优秀

原标题&#xff1a;华为智慧屏S Pro体验&#xff1a;告诉你鸿蒙OS有多优秀 从华为这些年的产品发展路线可以看得出&#xff0c;物联网产品体系组建是华为未来的重点方向。而“电视”是物联网体系中重要的一环&#xff0c;担当着客厅应用环境中的C位。因此&#xff0c;华为把投入…

非华为电脑实现华为一碰传、多屏协同安装指南

华为一碰传、多屏协同安装指南 000 安装多屏协同的前提&#xff1a;WIN10系统蓝牙适配器WIFI接收器&#xff08;支持5G才能成功、2.4G的不成功&#xff09; 000 安装一碰传的前提&#xff1a;WIN10系统NFC标签贴纸&#xff08;网络购买&#xff09; 001华为一碰传、多屏协同…

没有鸿蒙HarmonyOS,用这个软件也可以实现华为的多屏协助互动!

前几天华为发布了HarmonyOS 2不少小伙伴都应该知道了吧&#xff0c;相信有不少华为手机的小伙伴也应该体验到了&#xff0c;特别是多屏互动这个功能简直牛批到爆炸&#xff0c;而今天小七带来的这款软件&#xff0c;让你即使不用华为手机&#xff0c;华为电脑&#xff0c;也可以…

电脑系统没有自带的字体-楷体GB2312字体 免费版提供下载

楷体GB2312字体是一款电脑系统没有自带的字体。楷体GB2312字体如果没有&#xff0c;则会导致电脑中的某些软件显示不正常或者某些文档的文字显示不正常&#xff0c;它因执行GB2312-1980标准而得名&#xff0c;收字是6763个&#xff0c;是国标体&#xff0c;华军软件园提供下载地…

CSS3引入外部字体(苹方字体下载链接)

pingfang链接 &#xff1a; https://pan.baidu.com/s/1vyxkN-Edg17gVPHlnFoqsA 提取码&#xff1a;zwk0 CSS3引入代码&#xff1a; 等待引入的文件 font-face {font-family: 苹方黑体-准-简;src: url(../fonts/苹方黑体-准-简.ttf); } *{font-family: 苹方黑体-准-简; }

Android 字体ttf文件下载(含github下载地址)

含以下字体&#xff1a; github下载地址&#xff1a;https://github.com/Ice-Times/Android-ttf-download csdn下载地址&#xff1a;https://download.csdn.net/download/Ice_Times/12556432

LVGL中文字体制作

1、准备工作 lvgl原生不支持中文显示&#xff0c;但是lvgl官方提供了生成中文字体的工具。使用起来比较方便。LVGL支持的编码是UTF-8&#xff0c;而我们常用中文字体是GB2312。这就需要转换&#xff0c;大致的原理是&#xff0c;将现有字体中我们需要用的中文文字&#xff0c;…

用High-Logic FontCreator改进系统字体

我的windows11系统自带的微软雅黑字体&#xff0c;中文双引号是直引号而不是弯引号&#xff0c;而且缺少一些字&#xff0c;例如下面这个&#xff1a; 所以免不得要对这个字体进行一下改造。话说windows系统自带了一个“专用字符编辑程序”&#xff0c;但是这个程序实在要有很…