C++——list

目录

list介绍

list的函数接口

构造函数

push_front和pop_front

push_back和pop_back

insert

erase

迭代器

front和back

size

resize

empty

clear

list::sort

unique

reverse

迭代器的实现


list介绍

  1. list是一种可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素。
  3. list与forward_list非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代。
  4. 与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高。
  5. list和forward_list最大的缺陷是不支持在任意位置的随机访问,其次,list还需要一些额外的空间,以保存每个结点之间的关联信息(对于存储的类型较小元素来说这可能是一个重要的因素)。

        总的来说,list就是一个带头双向循环链表。


list的函数接口

构造函数

list<int> l1; //构造int类型的空容器
list<int> l2(10, 2); //构造含有10个2的int类型容器
list<int> l3(l2); //拷贝构造int类型的l2容器的复制品

push_front和pop_front

// push_front函数用于头插,pop_front函数用于头删
list<int> l;
l.push_front(1);
l.push_front(0);l.pop_front()

push_back和pop_back

// push_back函数用于尾插,pop_back函数用于尾删
list<int> l;
l.push_back(0);
l.push_back(1);l.pop_back();

insert

list<int> l;
l.push_back(0);
l.push_back(1);
l.push_back(2);list<int>::iterator pos = find(l.begin(), l.end(), 2); // 要包含algorithm库l.insert(pos, 10); // 在pos=2位置之前插入10l.insert(pos, 2, 9); // 在pos=2位置之前插入2个9

erase

list<int> l;
l.push_back(0);
l.push_back(1);list<int>::iterator pos = find(l.begin(), l.end(), 1);
if (pos != l.end()) // 一定要找到了再删除
{l.erase(pos); // 删除指定迭代器位置的元素// pos = l.erase(pos) // 也可以接受返回值,返回的是删除位置的下一个节点
}

        要注意的是list也有迭代器失效的问题,既然放到erase这里才讲,那就是erase的时候会导致迭代器失效。

迭代器

list<int> l(5, 2);
// 正向迭代器遍历容器
list<int>::iterator it = lt.begin();
while (it != lt.end())
{cout << *it << " ";it++;
}// 反向迭代器遍历容器
list<int>::reverse_iterator rit = lt.rbegin();
while (rit != lt.rend())
{cout << *rit << " ";rit++;
}

front和back

// size函数用于获取当前容器当中的元素个数
list<int> l;
l.push_back(0);
l.push_back(1);
l.push_back(2);
cout << l.size() << endl;

size

// front函数用于获取list容器当中的第一个元素,back函数用于获取list容器当中的最后一个元素
list<int> l;
l.push_back(0);
l.push_back(1);
l.push_back(2);cout << l.front() << endl;
cout << l.back() << endl; 

resize

// 当所给值大于当前的size时,将size扩大到该值,扩大的数据为第二个所给值,若未给出,则默认为容器所存储类型的默认构造函数所构造出来的值。
// 当所给值小于当前的size时,将size缩小到该值。
list<int> l(5, 1);
l.resize(10, 2);l.resize(2);

empty

list<int> l;
cout << l.empty() << endl; // 判断容器是否为空,返回的是bool类型,就是0或1

clear

// clear函数用于清空容器,清空后容器的size为0。
list<int> l(5, 1);
l.clear();

list::sort

list<int> l;
l.push_back(4);
l.push_back(7);
l.push_back(5);
l.push_back(9);l.sort(); // 默认将容器内数据排为升序// 既然algorithm中已经有了一个sort函数,那为什么还有在list中加入这个函数呢
// 那是因为,算法库中的sort让list使用是会报错的
// 算法库中的sort要求物理空间必须是连续的// 注意:一般也不会使用list中的sort函数
// 在数据量大的时候,效率较低,不如直接把数据插入到vector中使用algorithm中的sort函数

unique

// unique函数用于删除容器当中连续的重复元素,使用这个函数必须要先排序
list<int> l;
l.push_back(0);
l.push_back(0);
l.push_back(1);
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.unique();

reverse

// reverse函数用于将容器当中元素的位置进行逆置
list<int> l();
l.push_back(0);
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.reverse();

迭代器的实现

// 简单定义一下list的结构
template<class T>
class list_node // 结点
{T _data;list_node<T>* _next;list_node<T>* _prev;list_node(const T& x = T()):_data(x),_next(nullptr),_prev(nullptr){}
};template<class T>
struct __list_iterator // 这里使用struct不用考虑class的权限
{typedef list_node<T> Node;typedef __list_iterator<T> iterator;Node* _node; // 迭代器还是结点的指针__list_iterator(Node* node) // 用指针初始化迭代器:_node(node){}bool operator!=(const iterator& it) const{return _node != it._node; // 判断两个迭代器指针不等就可以了}T& operator*(){return _node->_data; // 解引用就是拿到结点指向的值}T* operator->() // ->运算符是使用指针来访问成员{return &(operator*()); // 拿到指针指向的数据再取地址返回这个指针类型}iterator& operator++() // ++就把下一个结点的指针赋值给_node,注意这是前置++{_node = _node->_next;return *this;}
};template<class T>
class list
{typedef list_node<T> Node;
public:typedef __list_iterator<T> iterator;void push_back(const T& x){Node* tail = _head->_prev;Node* newnode = new Node(x);tail->_next = newnode;newnode->_prev = tail;newnode->_next = _head;_head->_prev = newnode;}iterator begin() // begin就是头结点的下一个{return iterator(_head->_next); // 使用头结点的下一个的指针构造迭代器}iterator end() // end就是头结点{return iterator(_head->_prev);}list() // 构造函数{_head = new Node;_head->_next = _head;_head->_prev = _head;}
public:Node* _head;
};void test01()
{list<int> l;l.push_back(1);l.push_back(2);list<int>::iterator it = l.begin();while (it != l.end()){cout << it->_data << endl; // 使用->运算符重载,有的时候,list中存放的不是int类型的数据,只使用一次it->是不够的// 比如一个坐标类型,有两个成员变量,it->只能拿到这个坐标类型的指针// 但是还不能访问到这个类型的成员,所以需要使用it->->// 但这样又会显得很奇怪,所以编译器为了增加可读性进行了特殊处理,所以用一个->就可以了++it;}
}
// 既然有了正常的迭代器,那如果是const对象呢
// const对象使用正常迭代器时会出现权限的放大,不可以被修改
// 那有一个返回const类型的函数就可以了,例如下面这个函数T& opeartor*()
{}
// 这里可以添加一个返回const类型的函数
// 但是只有返回类型不一样不能构成重载
// 所以笨方法就是再写一个const迭代器类,这个类除了返回值不一样,其他的基本都一样
// 但是很忌讳这样写// 可以这样该一下模板参数
template<class T, class Ref, class Ptr> // Ref就是引用,Ptr就是指针
struct __list_iterator
{typedef __list_iterator<T, Ref, Ptr> iterator;// ...
}// operator*()就可以修改为
Ref opeartor*()
{}// operator->()可以修改为
Ptr operator->()
{}template<class T>
class list
{typedef list_node<T> Node;
public:typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;const_iterator cbegin() const{return cosnt_iterator(_head->_next);}const_iterator cend() const{return cosnt_iterator(_head);}// ...
}

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

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

相关文章

Java实现Web的ashx对接ORM

之前的介绍已经实现了ORM的主体和Web的调用结构主题&#xff0c;那么这次把Web和LIS.Core的容器和ORM做对接&#xff0c;通过ashx实现的业务类测试调用ORM查询数据。 首先改造容器让传入根地址 package LIS.Core.Context;import org.w3c.dom.Document; import org.w3c.dom.El…

@所有人,城市燃气信息化与信息安全建设方法

关键词&#xff1a;城市燃气信息化、智慧燃气建设、城市燃气安全、智慧燃气、智慧燃气平台 近几年&#xff0c;燃气作为一种新兴的燃料迅速普及开来&#xff0c;和燃气有关的企业之间的竞争也不可避免。身处在互联网的时代&#xff0c;企业只有顺应时代的潮流&#xff0c;将城…

Docker 学习路线 2:底层技术

了解驱动Docker的核心技术将让您更深入地了解Docker的工作原理&#xff0c;并有助于您更有效地使用该平台。 Linux容器&#xff08;LXC&#xff09; Linux容器&#xff08;LXC&#xff09;是Docker的基础。 LXC是一种轻量级的虚拟化解决方案&#xff0c;允许多个隔离的Linux系…

探索 Java 8 中的 Stream 流:构建流的多种方式

人嘛&#xff0c;要懂得避嫌… 开篇引入 Java 8引入了Stream流作为一项新的特性&#xff0c;它是用来处理集合数据的一种函数式编程方式。Stream流提供了一种更简洁、高效和易于理解的方法来操作集合数据&#xff0c;同时也能够实现并行处理&#xff0c;以提高性能。 以下是St…

Cesium:CGCS2000坐标系的xyz坐标转换成WGS84坐标系的经纬高度,再转换到笛卡尔坐标系的xyz坐标

作者:CSDN @ _乐多_ 本文将介绍使用 Vue 、cesium、proj4 框架,实现将CGCS2000坐标系的xyz坐标转换成WGS84坐标系的经纬高度,再将WGS84坐标系的经纬高度转换到笛卡尔坐标系的xyz坐标的代码。并将输入和输出使用 Vue 前端框架展示了出来。代码即插即用。 网页效果如下图所示…

VueX中的getters配置项

一、配置getters属性 当我们想对VueX中的state中的数据进行处理&#xff0c;我们就可以使用getter配置项。 就像是组件中的数据和计算属性之间的关系。 const getters { 属性名 (state) { return 处理结果; } } 我们能够直接拿到state进行操作&#xff0c;并返回操作结果。 …

Shadingsphere proxy 启动报错 Windows

Exception in thread "main" java.lang.NoClassDefFoundError 本来打算在本地电脑测试一下proxy的功能&#xff0c;使用的二进制安装包&#xff0c;没想到怎么都启动不起来&#xff0c;一直报找不到某个类的错误。我还以为是自身的配置有问题&#xff0c;等我copy了…

梯度消失和梯度爆炸的原因

梯度消失和梯度爆炸 梯度爆炸和梯度消失本质上是因为梯度反向传播中的连乘效应。 梯度下降算法 举一个简单的例子,函数表达式为loss 2w^2 4w,如下图 ​​​​​​​ ​​​​​​​ 为了求得w的最优值,使得loss最小,从上图很容易看出来当w -1时,loss最小…

服务器数据恢复—EMC存储pool上数据卷被误删的数据恢复案例

服务器数据恢复环境&#xff1a; EMC Unity某型号存储&#xff0c;连接了2台硬盘柜。2台硬盘柜上创建2组互相独立的POOL&#xff0c;2组POOL共有21块520字节硬盘。21块硬盘组建了2组RAID6&#xff0c;1号RAID6有11块硬盘. 2号RAID6有10块硬盘。 服务器故障&检测&#xff1…

【MySQL】 索引(上)

文章目录 1. 索引的概念2. MySQL与磁盘 的交互基本单位3. 建立共识4. 现象与结论如何理解mysql中page概念为什么 要采用page的方案 进行交互 而不是用多少加载多少&#xff1f; 5. 页目录为什么要引入 页目录概念单页情况多页情况使用B树 构建索引为什么不用其他数据结构为什么…

Classifier-Free Guidance

1.为什么需要分类引导 顾名思义&#xff0c;在原来扩散模型的基础上加上一个引导&#xff0c;让扩散模型朝着我们想要的方向去生成图像 从上图可以了解到生成下一张图像是有分类器参与的 无分类器就是这种形式要参与下一张图像的生成

SQL server数据库端口访问法

最近数据库连接&#xff0c;也是无意中发现了这个问题&#xff0c;数据库可根据端口来连接 网址:yii666.com< 我用的是sql2014测试的&#xff0c;在安装其他程序是默认安装了sql(sql的tcp/ip端口为xxx)&#xff0c;服务也不相同&#xff0c;但是由于比较不全&#xff0c;我…

ElementUI 自定义 Tree 树形控件背景

在 template 中 <div class"container"><el-tree :data"treeList" :props"defaultProps" accordion node-click"handleNodeClick" /> </div> 在 script 中 treeList: [{ id: "-1", label: "区域选…

oracle (8)Managing Tablespace Data File

目录 一、基础知识 1、表空间和数据文件 2、存储层次结构摘要 3、表空间的类型 4、表空间中的空间管理 5、临时表空间 6、Default Temporary TS 默认临时TS 二、常用实操 1、Creating Tablespaces创建表空间 2、Dictionary-Managed TS 字典管理的表空间 3、Locally …

uniapp 关于 video 组件的缩放比例问题

在 container 样式的 padding-bottom 设置比例值 9/16 比例值&#xff1a;56.25% 3/4 比例值&#xff1a;75% <view class"container"><video class"video-box" src"xxx.mp4" /> </view> .container {position: relative;wid…

与AI对话的艺术:如何优化Prompt以获得更好的响应反馈

前言 在当今数字化时代&#xff0c;人工智能系统已经成为我们生活的一部分。我们可以在智能助手、聊天机器人、搜索引擎等各种场合与AI进行对话。然而&#xff0c;要获得有益的回应&#xff0c;我们需要学会与AI进行有效的沟通&#xff0c;这就涉及到如何编写好的Prompt。 与…

设计模式之观察者模式

文章目录 一、介绍二、实现思路三、基本角色四、案例1. 不使用观察者模式2. 使用观察者模式 五、java中的观察者模式六、spring中的观察者模式七、优缺点 一、介绍 观察者模式(Observer Pattern)&#xff0c;又称监听器模式(Listener Pattern) 或 发布-订阅模式(Publish-Subsc…

OpenFeign的简单介绍和功能实操

前言 本文主要做一下OpenFeign的简单介绍和功能实操&#xff0c;实操主要是OpenFeign的超时和重试&#xff0c;在阅读本文章前&#xff0c;请完成《Nacos 注册中心介绍与实操》内的Nacos多模块生产消费者项目 什么是OpenFeign OpenFeign全名Spring Cloud OpenFeign&#xff…

树结构及其算法-二叉查找树

目录 树结构及其算法-二叉查找树 C代码 树结构及其算法-二叉查找树 二叉树在建立的过程中是根据“左子树 < 树根 < 右子树”的原则建立的&#xff0c;因此只需从树根出发比较键值即可&#xff0c;如果比树根大就往右&#xff0c;否则往左而下&#xff0c;直到相等就找…

基于OR-Tools的装箱问题模型求解(PythonAPI)

装箱问题 一、背包问题&#xff08;Knapsack problem&#xff09;1.1 0-1背包模型基于OR-Tools的0-1背包问题求解&#xff08;PythonAPI&#xff09;导入pywraplp库数据准备声明MIP求解器初始化决策变量初始化约束条件目标函数调用求解器打印结果 1.2 多重背包问题&#xff08;…