C++《list》

在本篇当中我们将学习STL中的list,在此list就是我们之前在数据结构学习过的链表,在本篇中我们要来了解list当中的成员函数该如何使用,由于list各个函数的接口和之前学习过的vector类型,因此在学习list的使用就较为轻松。在lis篇章中我们要重点了解的是在下一个篇章当中的list模拟实现中的迭代器实现,由于list底层的物理空间不一定是连续的,因此list迭代器的实现相比之前学习过的容器就复杂多了,在下一篇中将带来细致的讲解。在此之前我们先来了解list该如何使用吧!!


1.构造函数

queue - C++ Reference

通过以上的文档所示就可以看出list类提供的构造函数接口和之前我们学习过的vector非常的相识,都实现了迭代器区间构造;n个指定元素的构造;使用initializer_list实现构造;拷贝构造

例如以下实现:

#include<iostream>
#include<list>
#include<string>
using namespace std;int main()
{string a("abcdef");list<int> lt1;list<int> lt2({ 1,2,3,4,5 });list<int> lt3(a.begin(), a.end());list<int> lt4(10, 9);list<int> lt5(lt2);return 0;
}

 

2.析构函数

queue - C++ Reference

在list类当中也实现了析构函数,在此该函数不需要我们在使用list时显示调用,这是由于析构函数编译器会在list对象销毁时自动调用

3.赋值运算符重载

list::operator= - C++ Reference

在list实现了赋值运算符重载的函数,这就使得将一个已经初始化的list对象赋值给另一个已经初始化的list对象

例如以下示例:

#include<iostream>
#include<list>
using namespace std;int main()
{list<int> lt1;list<int> lt2({ 1,2,3,4,5 });lt1 = lt2;return 0;
}

 

4. 容量操作

在list当中由于和之前学习的string、vector不同在存储数据时,每存储一个指定的元素就申请相应的对应合适的内存空间,因此在list就不会提前将空间开好,这就使得list当中容量操作相关的函数只有以下所示:

4.1 size

list::size - C++ Reference 

在list提供了用于得到list对象内有效元素个数的成员函数size,到了这里你就可以了解到为什么之前在之前string当中得到有效元素建议使用size而不是length,这就使因为size在其他STL当中也是有提供的,而length只是string特有的,都使用size就利于记忆

4.2 empty

list::empty - C++ Reference

在list也提供用于判断list对象内有效元素是否为空的函数empty,当为空时就返回true,否则就为flase

5. 迭代器

在list类当中由于底层存储数据的内存空间不像string和vector一样物理结构是连续的,因此在list就没有提供下标+[ ]的方式实现对list对象内元素的访问,因此在list就只能使用迭代器来实现

在此list内的迭代器和之前学习过的容器一样也提供了普通迭代器和反向迭代器,并且在这些当中都实现了const和非const版本 

5.1 begin与end

list::begin - C++ Reference

在此list内提供的begin函数还是指向对象的第一个元素,返回值为迭代器

list::end - C++ Reference

在此list内提供的end函数还是指向对象的最后一个元素后一个位置,返回值为迭代器

有了begin()和end()就可以实现对list对象遍历,例如以下示例:

#include<iostream>
#include<list>
using namespace std;int main()
{list<int> lt2({ 1,2,3,4,5 });lt1 = lt2;list<int>::iterator t1 = lt1.begin();while (t1 != lt1.end()){(*t1)++;t1++;}t1 = lt1.begin();while (t1 != lt1.end()){cout << *t1 << " ";t1++;}cout << endl;return 0;
}

 

6.范围for

在此在list由于实现了迭代器那么就可以使用范围for来对list对象遍历其的元素

例如以下示例:

#include<iostream>
#include<list>
using namespace std;int main()
{list<int> lt1;lt1 = lt2;for (auto x : lt1){cout << x << " ";}cout << endl;return 0;
}

 

7.取头尾元素

list::front - C++ Reference

list::back - C++ Reference 

在list提供了front函数和back函数来分别实现得到list对象内的首元素与尾元素 

例如以下示例:

#include<iostream>
#include<list>
using namespace std;int main()
{list<int> lt2({ 1,2,3,4,5 });cout << "lt2front:" << lt2.front()<<endl;cout << "lt2back:" << lt2.back() << endl;return 0;
}

 

8.元素修改操作

在list当中提供了以上所示的各种用于修改list对象内元素的函数

8.1 push_front与pop_front

list::push_front - C++ Reference


list::pop_front - C++ Reference

 在list内实现了push_front和pop_front来放分别实现在对象内头插和头删元素
在此要了解到为什么在list会提供该函数而之前学习的string与vector都未实现该函数,这是由于在在链表当中头插和头删元素不需要像顺序表一样在头插和头删时将大量的元素移动,这样就不会出现效率低下的问题

8.2 push_back与pop_back

list::push_back - C++ Reference

 list::pop_back - C++ Reference

 在list内实现了push_back和pop_back来放分别实现在对象内尾插和尾删元素

8.3 insert和erase

list::insert - C++ Reference

list::erase - C++ Reference

在list也提供了inert和erase来实现任意位置的插入和删除,在此实现的接口和vector相识参数都是迭代器或者迭代器区间 

8.4 emplace_front与emplace_back

 list::emplace_front - C++ Reference

list::emplace_back - C++ Reference

在C++11之后实现了以上的两个函数emplace_front和emplace_back,那么这两个函数有什么作用呢?

在此你可以认为emplace_front和emplace_back与push_front和push_back的功能是类似的,功能分别是在list对象头插和尾插指定的数据,但其实这两个函数与push_front和push_back还是有差异的,接下来就来大体的讲解

注:在此emplace_front和emplace_back函数的参数涉及到可变模板参数、右值引用等概念在此不进行讲解,这些要到之后C++11篇章才进行

通过之前的学习我们知道push_front和push_back是可以实现在相应的类对象内插入内置类型的数据,也可以插入自定义类型的数据;并且在此支持隐式类型转换

例如以下示例:

#include<iostream>
#include<list>
using namespace std;class Postion
{
public:Postion(int row,int col):_row(row),_col(col){}private:int _row;int _col;
};int main()
{list<Postion> lt1;Postion p1(1,2);lt1.push_back(p1);//使用匿名对象lt1.push_back(Postion(1, 2));//使用多参数隐式类型转换lt1.push_back({ 1, 2 });return 0;
}

那么以上使用emplace_back不同的参数也可以使用吗

#include<iostream>
#include<list>
using namespace std;class Postion
{
public:Postion(int row,int col):_row(row),_col(col){}private:int _row;int _col;
};int main()
{list<Postion> lt1;Postion p1(1, 2);lt1.emplace_back(p1);lt1.emplace_back(Postion(1, 2));lt1emplace_back({ 1, 2 });return 0;
}

以上代码在VS下就会出现以下的编译报错,这是为什么呢?


 

要解决以上的问题就先了解到emplace_back的形参的类型是根据实参的类型来推导的,那么在以上使用隐式类型转换形参就无法根据实参{ 1, 2 }来推导具体的类型,这里具体的原因就是形参是模板

在此emplace_back和emplace_front最大的特点是支持直接将构造对象的参数直接传emplace_back和emplace_front函数的参数

因此以上代码正确的使用方法是如下所示:

#include<iostream>
#include<list>
using namespace std;class Postion
{
public:Postion(int row,int col):_row(row),_col(col){}
private:int _row;int _col;
};int main()
{list<Postion> lt1;Postion p1(1,2);lt1.push_back(p1);lt1.push_back(Postion(1, 2));lt1.push_back({ 1, 2 });list<Postion> lt1;Postion p1(1, 2);lt1.emplace_back(p1);lt1.emplace_back(Postion(1, 2));//lt.1emplace_back({ 1, 2 });lt1.emplace_back( 1, 2 );return 0;
}

注:在此由于emplace_back是直接构造去初始化节点,而push_back需要通过构造外加拷贝实现的,因此emplace_back相比push_back效率更高

9. list内特有的操作

在list中提供了以上特有的函数来实现逆置、排序等的操作,这些操作是之前我们在string和vector当中没有提供的,那么接下来我们就来了解这些函数的作用以及使用方法

9.1 splice

list::splice - C++ Reference

在此splice的作用是将一个list对象的值转移给另一个list的对象,并且转移之后被转移对象会变为空

例如以下示例:

#include<iostream>
#include<list>
using namespace std;int main()
{list<int> mylist1, mylist2;list<int>::iterator it;// set some initial values:for (int i = 1; i <= 4; ++i)mylist1.push_back(i);      // mylist1: 1 2 3 4for (int i = 1; i <= 3; ++i)mylist2.push_back(i * 10);   // mylist2: 10 20 30it = mylist1.begin();++it;                         // points to 2mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4// mylist2 (empty)// "it" still points to 2 (the 5th element)return 0;
}

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

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

相关文章

【牛客刷题实战】二叉树遍历

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 牛客题目&#xff1a; 二叉树遍历 题目描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码&#xff08;C语言&#xff09; 兄弟们共勉 &#xff01;&…

vmvare启动freebsd操作系统密码忘记了怎么办?

本章教程,主要介绍,通过vmvare安装的freebsd操作系统,密码忘记了,如何重置密码。 一、重启虚拟机 在重启过程中,按键盘中是数字2,进入单用户模式。 二、进入到shell界面 在出现“Enter full pathname of shell or RETURN for /bin/sh:”直接按回车键。 三、输入命令 mou…

【设计模式系列】代理模式(八)

一、什么是代理模式 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下&#xff0c;提供了对目标对象的间接访问。通过引入一个代理对象来间接操作实际对…

WPS查询函数VLOOKUP,匹配寻找值自动带入值

想实现在下表输入物料名称后&#xff0c;把上表中的单位自动带入 那就要用到VLOOKUP函数&#xff0c;获取第2个表第1列的值后去第1个表的第1列匹配&#xff0c;匹配到后得到行数值&#xff0c;把第1个表的第2列赋值给第2个表的第2列。 Vlookup函数参数为Vlookup(查找值&#…

sqoop问题汇总记录

此篇博客仅记录在使用sqoop时遇到的各种问题。持续更新&#xff0c;有问题评论区一起探讨&#xff0c;写得有不足之处见谅。 Oracle_to_hive 1. main ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTr…

简单说明vuex

vuex 知识结构配置调用 知识结构 vue用于管理公共数据的仓库 配置 state&#xff1a;所有公共数据的初始状态&#xff08;初始值&#xff09; export default {state: {count: 0,} };mutations&#xff1a;修改state内容的方法&#xff08;必须为同步方法&#xff09; export …

分类算法——决策树 详解

决策树的底层原理 决策树是一种常用的分类和回归算法&#xff0c;其基本原理是通过一系列的简单决策&#xff0c;将数据集划分为多个子集&#xff0c;从而实现分类。决策树的核心思想是通过树形结构表示决策过程&#xff0c;节点代表特征&#xff0c;边代表决策&#xff0c;叶子…

Nature Electronics 用于语音识别的液体声传感器,基于悬浮在载液的钕-铁-硼磁性纳米颗粒

近年来&#xff0c;工程师们开发了一系列越来越复杂的传感器&#xff0c;用于机器人、便携式、可穿戴甚至植入式监测。然后&#xff0c;可以使用最先进的机器学习来分析这些传感器收集的数据&#xff0c;使设备能够识别音频中的特定声音、图像中的对象或其他信息。加州大学洛杉…

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持视频投放在电视墙上

在当今智能化、数字化的时代&#xff0c;视频监控已经成为各行各业不可或缺的一部分&#xff0c;无论是公共安全、交通管理、企业监控还是智慧城市建设&#xff0c;都离不开高效、稳定的视频监控系统的支持。而在这些应用场景中&#xff0c;将监控视频实时投放到大屏幕电视墙上…

【GeoJSON在线编辑平台】(0)项目启动与前言

前言 事情是这样的…… 有这么一个项目&#xff0c;需要开发一个在线的标注平台。以天地图为底图&#xff0c;在天地图上标注出一些特征地物&#xff0c;比如描出农田耕地房屋建筑之类的要素。 这个需求简化一下其实就是一个在线的矢量编辑平台&#xff0c;通过绘制多边形功能…

豆包,攻克数字是个什么工具?《GKData-挖掘数据的无限可能》(数据爬虫采集工具)

豆包&#xff0c;攻克数字是个什么工具&#xff1f; “攻克数字” 指的是 “攻克数字&#xff08;GKData&#xff09;” 这样一款工具。是一款针对网页、APP中数据自动解析转表存入数据库的软件&#xff0c;为数据工作者而生。它是一个不会编程也能用的可视化数据解析为标准二…

【成都新篇】龙信科技电子取证实验室,引领科技取证新时代

文章关键词&#xff1a;电子数据取证实验室、手机取证、介质取证、云取证、现场勘查、电子物证 在科技创新的浪潮中&#xff0c;龙信科技成都实验室以其卓越的电子数据取证服务&#xff0c;成为了中西部地区一颗璀璨的明珠。随着新址的搬迁&#xff0c;我们不仅扩大了业务范围…

【C/C++】字符/字符串函数(1)——由string.h提供

零.导言 什么是字符/字符串函数呢&#xff1f; 其实就是一类用于处理字符和字符串的函数。 而其中一部分函数包含在头文件 string.h 中&#xff0c;有 strlen strcpy strcat strcmp strncpy strncat strncmp strstr strtok strerror 等等 接下来我将逐个讲解这些函数。 一.str…

硅谷甄选(11)角色管理

角色管理模块 10.1 角色管理模块静态搭建 还是熟悉的组件&#xff1a;el-card、el-table 、el-pagination、el-form <template><el-card><el-form :inline"true" class"form"><el-form-item label"职位搜索"><el-…

鸿蒙UI开发——基于全屏方案实现沉浸式界面

1、概 述 典型应用全屏窗口UI元素包括状态栏、应用界面和底部导航条。 其中状态栏和导航条&#xff0c;通常在沉浸式布局下称为避让区&#xff0c;避让区之外的区域称为安全区。 开发应用沉浸式效果主要指&#xff1a;通过调整状态栏、应用界面和导航条的显示效果来减少状态…

规划误差降低27%,碰撞率降低33%Senna: 大规模视觉-语言模型与端到端自动驾驶相结合

Abstract 端到端自动驾驶在大规模数据中展示了强大的规划能力&#xff0c;但在复杂、罕见的场景中仍然因常识有限而表现不佳。相比之下&#xff0c;大型视觉语言模型&#xff08;LVLMs&#xff09;在场景理解和推理方面表现出色。前进的方向在于融合两者的优势。以往利用LVLMs…

openpnp - 手工修改配置文件(元件高度,size,吸嘴)

文章目录 openpnp - 手工修改配置文件(元件高度,size,吸嘴)概述笔记parts.xmlpackages.xml 手工将已经存在的NT1,NT2拷贝出来改名备注END openpnp - 手工修改配置文件(元件高度,size,吸嘴) 概述 载入新板子贴片准备时&#xff0c;除了引入Named CSV文件&#xff0c;还要在ope…

硬件电子器件学习笔记

系列文章目录 文章目录 系列文章目录电阻碳质电阻器线绕电阻 变压器自耦变压器隔离变压器 电阻 碳质电阻器 CCR&#xff1a; 优点&#xff1a;体积大&#xff0c;吸收脉冲电流、防浪涌。缺点&#xff1a;温度系数、稳定性差、吸水后也会变化、随着使用会变化。 医用除颤仪可…

推荐一款射频与微波电路设计软件:Keysight Genesys

Keysight PathWave RF Synthesis Genesys是一款专为射频 (RF) 和微波电路设计与仿真而开发的软件解决方案&#xff0c;属于 Keysight Technologies 的 PathWave 软件平台。此平台为无线通信系统的设计、仿真和验证提供了全面的工具支持。Genesys 在电路设计方面具备高度专业性&…

创新业态下金融头部机构在 FICC 平台建设上的思考与实践

近年来&#xff0c;FICC 投资交易呈现活跃多元态势&#xff0c;创新转型稳步推进。FICC 平台电子化方兴未艾&#xff0c;是机构提升服务效率和质量的一大着力点。因此&#xff0c;在 FICC 平台建设上&#xff0c;许多机构都进行了深入研究&#xff0c;积累了丰富的实践经验。 …