C++中的list容器
文章目录
- list的介绍
- list的使用
- list的构造
- list iterator的使用
- list capacity
- list元素访问
- list modifiers
- list的迭代器失效
- list与vector的对比
list的介绍
list是可以在常数范围内的任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代;
list的底层是双向链表结构,双向链表中每个元素存储在不互相关的独立节点中,在节点中通过指针指向前一个与后一个元素;
list与forward_list非常相似,forward_list是单链表,只能向前迭代;
与其他的序列式容器相比,list通常在任意位置进行插入、移动元素的执行效率更好。但是list和forward_list最大的缺陷是不支持任意位置的随机访问,如果要访问某一位置,必须要从已知的位置开始迭代到对应位置,在这段位置上迭代需要线性的时间开销,list还需要一些额外的空间,用来保存每个节点的相关信息。
list的使用
list的构造
构造函数constructor | 接口说明 |
---|---|
list(size_type n, const value_type& val = value_type()) | 构造的list中包含n个值为val的元素 |
list() | 构造空的list |
list(const list& x) | 拷贝构造函数 |
list(InputIterator first, InputIterator last) | 用[first, last]区间中的元素构造list |
int main()
{list<int> first;list<int> second(4, 100);list<int> third(second.begin(), second.end());list<int> fourth(third);int myints[] = { 1, 2, 3, 4 };list<int> fifth(myints, myints + sizeof(myints) / sizeof(int));cout << "The contents of fifth are:";for (list<int>::iterator it = fifth.begin(); it != fifth.end(); it++)cout << *it << ' ';cout << endl;return 0;
}
list iterator的使用
函数声明 | 接口说明 |
---|---|
begin+end | 返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器 |
rbegin+rend | 返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置 |
cbegin+cend | 返回第一个元素的const_iterator+返回最后一个元素下一个位置的const_iterator |
crbegin+crend | 返回第一个元素的const_reverse_iterator,即end位置,返回最后一个元素下一个位置的const_reverse_iterator,即begin位置 |
begin与end是正向迭代器,对迭代器执行++操作,迭代器向后移动;
rbegin与rend作为反向迭代器,对迭代器执行++操作,迭代器向前移动;
cbegin+cend与crbegin+crend是C++11引入的。
int main()
{int myints[] = { 1, 2, 3, 4, 5 };list<int> mylist(myints, myints + 5);cout << "myints contains:";for (list<int>::iterator it = mylist.begin(); it != mylist.end(); it++)cout << ' ' << *it;cout << endl;cout << "myints backwards:";for (list<int>::reverse_iterator rit = mylist.rbegin(); rit != mylist.rend(); ++rit)cout << ' ' << *rit;cout << endl;return 0;
}
list capacity
函数声明 | 接口说明 |
---|---|
empty | 检测list是否为空,是返回true,否则返回false |
size | 返回list中有效节点的个数 |
max_size | 返回最大节点的个数 |
int main()
{list<int> mylist;int sum(0);cout << "max_size:" << mylist.max_size() << endl;cout << "1.size:" << mylist.size() << endl;for (int i = 1; i <= 10; i++)mylist.push_back(i);cout << "2.size:" << mylist.size() << endl;while (!mylist.empty()){sum += mylist.front();mylist.pop_front();}cout << "total:"<< sum << endl;return 0;
}
list元素访问
函数声明 | 接口说明 |
---|---|
front | 返回list的第一个节点中,值的引用 |
back | 返回list的最后一个节点中,值的引用 |
int main()
{list<int> mylist;mylist.push_back(77);mylist.push_back(33);mylist.push_back(22);cout << "front:" << mylist.front() << endl;cout << "back:" << mylist.back() << endl;mylist.front() -= 10;cout << "front:" << mylist.front() << endl;mylist.back() += 20;cout << "back:" << mylist.back() << endl;return 0;
}
list modifiers
函数声明 | 接口说明 |
---|---|
push_front | 在list首元素前插入元素 |
pop_front | 删除list中第一个元素 |
push_back | 在list尾部插入元素 |
pop_back | 删除list中最后一个元素 |
insert | 在list的任意位置插入元素 |
erase | 删除list任意位置的元素 |
swap | 交换两个list中的元素 |
clear | 清空list中的有效元素 |
int main()
{list<int> mylist(4, 0);list<int>::iterator it = mylist.begin();cout << "mylist:";for (it = mylist.begin(); it != mylist.end(); ++it)cout << ' ' << *it;cout << endl;mylist.push_front(1);mylist.push_back(9);cout << "mylist:";for (it = mylist.begin(); it != mylist.end(); ++it)cout << ' ' << *it;cout << endl;mylist.pop_front();mylist.pop_back();cout << "mylist:";for (it = mylist.begin(); it != mylist.end(); ++it)cout << ' ' << *it;cout << endl;it = mylist.begin();mylist.insert(it, 10);it++;mylist.insert(it, 3, 5);cout << "mylist:";for (it = mylist.begin(); it != mylist.end(); ++it)cout << ' ' << *it;cout << endl;it = mylist.begin();it++;mylist.erase(it);cout << "mylist:";for (it = mylist.begin(); it != mylist.end(); ++it)cout << ' ' << *it;cout << endl;list<int>::iterator it1 = mylist.begin();list<int>::iterator it2 = mylist.begin();it1++;advance(it2, 5); // 迭代器移动三位mylist.erase(it1, it2);cout << "mylist:";for (it = mylist.begin(); it != mylist.end(); ++it)cout << ' ' << *it;cout << endl;return 0;
}
int main()
{list<int> mylist1(4, 1);list<int> mylist2(4, 2);cout << "mylist1:";for (list<int>::iterator it = mylist1.begin(); it != mylist1.end(); it++)cout << ' ' << *it;cout << endl;cout << "mylist2:";for (list<int>::iterator it = mylist2.begin(); it != mylist2.end(); it++)cout << ' ' << *it;cout << endl;mylist1.swap(mylist2);cout << "mylist1:";for (list<int>::iterator it = mylist1.begin(); it != mylist1.end(); it++)cout << ' ' << *it;cout << endl;cout << "mylist2:";for (list<int>::iterator it = mylist2.begin(); it != mylist2.end(); it++)cout << ' ' << *it;cout << endl;mylist1.clear();mylist1.push_back(9);mylist1.push_back(9);mylist1.push_back(9);cout << "mylist1:";for (list<int>::iterator it = mylist1.begin(); it != mylist1.end(); it++)cout << ' ' << *it;cout << endl;return 0;
}
list的迭代器失效
迭代器失效即迭代器所指向的节点无效,也就是对应节点被删除了。因为list的底层结构为带头节点的双向循环链表,因为在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向删除节点的迭代器,其他迭代器不会受到影响。
int main()
{list<int> mylist(4, 0);list<int>::iterator it = mylist.begin();it = mylist.begin();it++;mylist.erase(it); // 这里it已经失效,如要使用需重新赋值cout << "mylist:";for (it = mylist.begin(); it != mylist.end(); ++it)cout << ' ' << *it;cout << endl;list<int>::iterator it1 = mylist.begin();list<int>::iterator it2 = mylist.begin();it1++;advance(it2, 5); // 迭代器移动三位mylist.erase(it1, it2);cout << "mylist:";for (it = mylist.begin(); it != mylist.end(); ++it)cout << ' ' << *it;cout << endl;return 0;
}
list与vector的对比
vector | list | |
---|---|---|
底层结构 | 动态顺序表,一段连续的空间 | 带头结点的双向循环链表 |
随机访问 | 支持随机访问,访问某个元素的效率为O(1) | 不支持随机访问,访问某个元素的效率为O(N) |
插入和删除 | 任意位置插入和删除效率低,需要移动元素O(N),插入时需要增容,开辟新空间,释放旧空间 | 任意位置插入和删除效率高,不需要移动元素 |
空间利用率 | 底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高 | 底层节点动态开辟,小节点容易造成内存碎片,空间利用率低 |
迭代器 | 原生态指针 | 对原生态指针(节点指针)进行封装 |
迭代器失效 | 在插入元素时,要给所有的迭代器重新赋值,因为插入元素有可能会导致重新扩容,导致原来的迭代器失效,删除时,当前迭代器需要重新赋值否知会失效 | 插入元素不会导致迭代器失效,删除元素时,只会导致当前迭代器失效,其他迭代器不受影响 |
使用场景 | 需要高效存储,支持随机访问,不关心插入删除效率 | 大量插入和删除操作,不关心随机访问 |
相关文章:

C++中的list容器
文章目录 list的介绍list的使用list的构造list iterator的使用list capacitylist元素访问list modifierslist的迭代器失效 list与vector的对比 list的介绍 list是可以在常数范围内的任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代; …...
Apache Hudi初探(二)(与spark的结合)
背景 目前hudi的与spark的集合还是基于spark datasource V1来的,这一点可以查看hudi的source实现就可以知道: class DefaultSource extends RelationProviderwith SchemaRelationProviderwith CreatableRelationProviderwith DataSourceRegisterwith StreamSinkPr…...

颠覆世界的“数字孪生”到底是什么?这篇文章带你搞懂全部内涵!
在春节很火的电影《流浪地球2》中,已经去世的小女孩图丫丫,被她的父亲重新将其个人的信息模型导入最强大的计算机而“复活”了。屏幕中的丫丫就是一个数字孪生体。我们可以看到她的一颦一笑,听到她跟你的对话,看到她做出反应。这就…...
Vector底层结构和源码分析
Vector的基本介绍 1.Vector类的定义说明 public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable 2)Vector底层也是一个对象数组,protected Objectl] elementData; 3)Vector是线程同步的&…...
计算卸载论文阅读01-理论梳理
标题:When Learning Joins Edge: Real-time Proportional Computation Offloading via Deep Reinforcement Learning 会议:ICPADS 2019 一、梳理 问题:在任务进行卸载时,往往忽略了任务的特定的卸载比例。 模型:针…...

Windows 11 本地 php 开发环境搭建:PHP + Apache + MySQL +VSCode 安装和环境配置
目录 前言1. PHP 的下载、安装和配置1.1 下载 php1.2 安装 php1.3 配置 php 系统变量1.4 配置 php.ini 2. Apache 的下载、安装和配置2.1 下载 Apache2.2 安装 Apache2.3 修改配置 Apache2.4 指定服务端口(非必须)2.5 配置系统变量2.6 安装服务2.7 Apach…...
15个使用率超高的Python库,下载量均过亿
今天给大家分享最近一年内PyPI上下载量最高的Python包。现在我们来看看这些包的作用,他们之间的关系,以及为什么如此流行。 1. Urllib3:8.93亿次下载 Urllib3 是 Python 的 HTTP 客户端,它提供了许多 Python 标准库没有的功能。 …...

所有知识付费都可以用 ChatGPT 再割一次?
伴随春天一起到来的,还有如雨后春笋般冒出的 ChatGPT / AI 相关的付费社群、课程训练营、知识星球等。 ChatGPT 吹来的这股 AI 热潮,这几个月想必大家多多少少都能感受到。 ▲ 图片来源:网络 这两张图是最近在圈子里看到的。 一张是国内各…...
Python中“is”和“==”的区别(避坑)
2.3 “is”和“”的区别 在Python编写代码时,经常会遇到需要判断2个对象是否相等的情况,这个时候一般就会想到使用is和,is和好像都可以用来判断对象是否相等,经常会傻傻分不清,但其实这其中还是有区别的。 不过在这之…...
20230426----重返学习-vue-router路由
day-058-fifty-eight-20230426-vue-router路由 vue-router路由 路由:切换页面,单页面应用上使用的 hash模式—锚点 对应vue版本 如何使用路由版本 vue2 —> router3vue3 —> router4 使用vue-router 创建项目的时候,直接选中路由…...

Java字节码指令
Java代码运行的过程是Java源码->字节码文件(.class)->运行结果。 Java编译器将Java源文件(.java)转换成字节码文件(.class),类加载器将字节码文件加载进内存,然后进行字节码校验,最后Java解释器翻译成机器码。 …...

Vue3之setup参数介绍
setup(props, context) {... }一、参数 使用setup函数时,它将接受两个参数: propscontext 让我们更深入地研究如何使用每个参数 二、Props setup函数中的第一个参数是props。正如在一个标准组件中所期望的那样,setup函数中的props是响应…...

ESET NOD32 互联网安全软件和防毒软件 -简单,可靠的防护。
安全防范病毒和间谍软件,银行和网上购物更安全, 网络摄像头和家用路由器使用更安全,阻止黑客访问您的电脑, 让您的孩子网络安全;产品兑换码仅支持中国ip地址兑换,兑换后可全球通用。 简单,可靠的防护 防范黑客&#x…...

试试这几个冷门但好用的软件吧
软件一:探记 探记是一款专注于个人记录每一条记录的工具,主要特点如下: 简单易用:探记的界面设计简洁明了,操作流程简单易用,用户可以快速、方便地添加记录。 多样化记录类型:探记支持多种记…...

【云原生】k8s NetworkPolicy 网络策略是怎么样的
前言 随着微服务的流行,越来越多的云服务平台需要大量模块之间的网络调用。 在 Kubernetes 中,网络策略(NetworkPolicy)是一种强大的机制,可以控制 Pod 之间和 Pod 与外部网络之间的流量。 Kubernetes 中的 NetworkPolicy 定义了一组规则&…...

手把手教你用几行代码给winform多个控件(数量无上限)赋值
前言: 我们在开发winform程序的过程中,经常会遇到这样一个场景,我们设计的界面,比如主窗体有一百多个TextBox,然后初始化的时候要对这个一百多个TextBox的Text属性赋值,比如赋个1,如果是winfor…...
回炉重造十一------ansible批量安装服务
1.playbook的核心组件 Hosts 执行的远程主机列表Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最 少元素需包括 name 和 task,一个name只能包括一个taskVariables 内置变量或自定义变量在playbook中调用Templates 模板,…...

系统集成项目管理工程师 笔记(第20章:知识产权管理、第21章:法律法规和标准规范)
文章目录 20.1.2 知识产权的特性 58420.2.1 著作权及邻接权 58520.2.2 专利权 58920.2.3 商标权 59221.3 诉讼时效 59921.6.3 标准分级与标准类型 60321.7.2 信息系统集成项目管理常用的技术标准 6061、基础标准2、开发标准3、文档标准4、管理标准 第20章 知识产权管理 584 20.…...

Channel-wise Knowledge Distillation for Dense Prediction(ICCV 2021)原理与代码解析
paper:Channel-wise Knowledge Distillation for Dense Prediction official implementation:https://github.com/irfanICMLL/TorchDistiller/tree/main/SemSeg-distill 摘要 之前大多数用于密集预测dense prediction任务的蒸馏方法在空间域spatial…...

No.052<软考>《(高项)备考大全》【冲刺6】《软考之 119个工具 (4)》
《软考之 119个工具 (4)》 61.人际交往:62.组织理论:63.预分派:64.谈判:65.招募:66.虚拟团队:67.多标准决策分析:68.人际关系技能:69.培训:70.团队建设活动:71.基本规则:72.集中办公:73.认可与奖励:74.人事评测工具:75.观察和交谈:76.项目绩效评估:77.冲…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...