wordpress做双语网站/优化师是干嘛的

wordpress做双语网站,优化师是干嘛的,公众号商城制作价格,手机模块网站文章目录 1. list的构造2. list迭代器的常见接口2.1 list遍历的迭代器接口2.2 list修改数据的迭代器接口2.3 list排序、逆序、合并相关操作的成员函数 3. 模拟实现list3.1 模拟实现list的构造3.2 模拟实现list的尾插3.3 模拟实现迭代器iterator3.4 模拟实现list的插入删除3.5 模…

文章目录

  • 1. list的构造
  • 2. list迭代器的常见接口
    • 2.1 list遍历的迭代器接口
    • 2.2 list修改数据的迭代器接口
    • 2.3 list排序、逆序、合并相关操作的成员函数
  • 3. 模拟实现list
    • 3.1 模拟实现list的构造
    • 3.2 模拟实现list的尾插
    • 3.3 模拟实现迭代器iterator
    • 3.4 模拟实现list的插入删除
    • 3.5 模拟实现list的析构和clear
    • 3.6 模拟实现list的深拷贝
  • 4. 代码

   相信学过string和vector容器后,对于list应该游刃有余了,接下来我将带大家将list的大致框架过一遍,然后来模拟实现下list。


  • 首先介绍下list,list其实就是C++实现的一个带头节点的双向链表,当然如果想了解单链表的话,也可以学习forward_list

1. list的构造

构造函数接口说明
list(size_t n, const size_type& val)用n个val值来构造list对象
list(Inputiterator first, Inputiterator last)用迭代器区间构造list对象
list(const list& lt)用list对象lt来构造list对象

在这里插入图片描述


2. list迭代器的常见接口

2.1 list遍历的迭代器接口

迭代器接口说明
begin()指向list对象中的第一个数据
end()指向list对象最后一个数据的下个位置
rbegin()指向反向迭代器的第一个数据
rend()指向反向迭代器的最后一个元素的前一个位置
empty()判断list对象是否为空
size()返回list对象有效数据个数
front()返回list对象的第一个数据
back()返回list对象的最后一个数据

在这里插入图片描述


2.2 list修改数据的迭代器接口

迭代器接口说明
assign()为list容器重新分配内容,并相应修改容器容量大小
push_back()尾插数据
emplace_back()尾部插入数据
pop_back()尾删数据
push_front()头插数据
pop_front()头删数据
emplace_front()头部插入数据
insert()指定位置插入数据
erase()删除指定位置数据
swap()交换两个list对象里面的数据和size
clear()删除list里面的所有数据,size置为0

在这里插入图片描述


  • 当然assign()也可以使用迭代器进行初始化
  • 需要注意的是,C++实现的迭代器分为3种:单向迭代器、双向迭代器、随机迭代器
  • 单向迭代器只支持++不支持 - -
  • 双向迭代器支持++和 - -
  • 随机迭代器只支持++、 - - 、+ 、 -
  • 恰好list模版实现时就是双向迭代器

在这里插入图片描述


  • push_back()emplace_back()的区别

在这里插入图片描述


在这里插入图片描述


  • pop_back()、pop_front()删除数据

在这里插入图片描述


在这里插入图片描述


  • 由于list模版中没有实现find函数查找,因此需要调用算法库实现的find()函数模版

在这里插入图片描述


2.3 list排序、逆序、合并相关操作的成员函数

迭代器接口说明
splice将另一个列表(或同一列表的另一个部分)的元素移动到当前列表的指定位置
remove删除容器中等于val值的元素
reverse将list对象的数据逆序排列
merge合并
sort排序(使用的归并排序)
unique删除list中重复且相邻的数据,只保留一个
  • list里面的remove(const value_type& val)会删除list对象中所有等于val值的数据

在这里插入图片描述


  • reverse()逆序

在这里插入图片描述


在这里插入图片描述


  • 其实这里有个疑问需要解释下:C++算法库里面实现有sort()排序模版,为什么这里还要实现sort呢?
  • 这是因为算法库实现的sort容器是随机迭代器版本,对于链表来说不支持随机访问,只能从头遍历,因此list实现了一个sort排序的接口,主要利用归并排序可以很好的解决这个问题

在这里插入图片描述


在这里插入图片描述


  • merge接口:用来合并两个list对象,并且会将合并的list对象置size为空
  • list中merge使用时,需要注意两个list是已经排好序的,否则无法使用

在这里插入图片描述


  • splice接口:在给定的迭代器位置插入list对象

在这里插入图片描述


在这里插入图片描述


  • unique:删除重复且相邻数据,仅保留一个

在这里插入图片描述


3. 模拟实现list

3.1 模拟实现list的构造

在这里插入图片描述


3.2 模拟实现list的尾插

在这里插入图片描述


3.3 模拟实现迭代器iterator

  • list是双向链表,链表的每个节点都是单独存在的,因此链表不是连续的物理空间
  • list的每个节点都保存了指向上个节点和下个节点的指针,分别为prev、next,另外每个节点还存储了数据data
  • 由于list不是连续的物理空间,实现list时就不能使用typedef T* iterator这样的方式,因为迭代器++时找不到下个节点的位置
  • 由于迭代器指的是具有像指针一样行为的容器,那么就可以将迭代器单独封装为一个类
  • 链表的结构图
    在这里插入图片描述

在这里插入图片描述


  • list除了存储一些内置类型的数据,有时还会存储自定义类型的数据
  • 而自定义类型的对象往往不支持流插入操作,这就回导致迭代器访问时出现报错

在这里插入图片描述


  • 解决办法1

在这里插入图片描述


  • 解决办法2

在这里插入图片描述


  • const修饰的迭代器版本
//const修饰的迭代器
template<class T>
struct list_const_iterator
{typedef list_node<T> Node;Node* node;//迭代器的构造函数list_const_iterator(Node* _node):node(_node){}//解引用操作符*重载const T& operator*(){return node->data;}//解引用操作符->重载const T* operator->(){return &node->data;}//++运算符重载list_const_iterator<T>& operator++(){node = node->next;return *this;}//!=运算符重载bool operator!=(const list_const_iterator<T>& it){return node != it.node;}//==运算符重载bool operator==(const list_const_iterator<T>& it){return node == it.node;}
};
  • const修饰的迭代器本身可以修改,但是指向的内容是不可以修改的
  • const迭代器使用

在这里插入图片描述


在这里插入图片描述


  • 合并普通迭代器和const修饰的迭代器,使用迭代器模版

在这里插入图片描述


  • 前置++(或–)和后置++(或–)的实现

在这里插入图片描述
前置++是先++后再使用,因此是++走向下个节点后返回自身的引用;而后置++是先使用再++,因此是先返回自身再走向下个节点,需要创建临时对象tmp来保存节点更改前的迭代器
这里需要注意的是,为了区分前后置++,默认给后置++的形参参数为int,这里int仅做区分使用。由于前置++不需要创建临时对象,因此对比之下更高效


3.4 模拟实现list的插入删除

  • insert(指定位置)插入和erase(指定位置)删除

在这里插入图片描述


  • 头插尾插和头删尾删

在这里插入图片描述


3.5 模拟实现list的析构和clear

在这里插入图片描述


3.6 模拟实现list的深拷贝

在这里插入图片描述


  • 赋值运算符重载

在这里插入图片描述


  • 多参数初始化构造

在这里插入图片描述


  • 初始化后

在这里插入图片描述


4. 代码

  • 头文件代码
#pragma once#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
#include <assert.h>
using namespace std;namespace TT
{template<class T>struct list_node{list_node<T>* prev;list_node<T>* next;T data;//构造初始化list_node(const T& x = T()):prev(nullptr),next(nullptr),data(x){ }};template<class T,class Ref,class Ptr>struct list_iterator{typedef list_node<T> Node;typedef list_iterator<T, Ref, Ptr> Self;Node* node;//迭代器的构造函数list_iterator(Node* _node):node(_node){}//解引用操作符*重载Ref operator*(){return node->data;}//解引用操作符->重载Ptr operator->(){return &node->data;}//(前置)++运算符重载Self& operator++(){node = node->next;return *this;}//(后置)++运算符重载Self operator++(int){Self tmp(*this);node = node->next;return tmp;}//(前置)--运算符重载Self& operator--(){node = node->prev;return *this;}//(后置)--运算符重载Self operator--(int){Self tmp(*this);node = node->prev;return tmp;}//!=运算符重载bool operator!=(const Self& it){return node != it.node;}//==运算符重载bool operator==(const Self& it){return node == it.node;}};//const修饰的迭代器//template<class T>//struct list_const_iterator//{//	typedef list_node<T> Node;//	Node* node;//	//迭代器的构造函数//	list_const_iterator(Node* _node)//		:node(_node)//	{}//	//解引用操作符*重载//	const T& operator*()//	{//		return node->data;//	}//	//解引用操作符->重载//	const T* operator->()//	{//		return &node->data;//	}//	//++运算符重载//	list_const_iterator<T>& operator++()//	{//		node = node->next;//		return *this;//	}//	//!=运算符重载//	bool operator!=(const list_const_iterator<T>& it)//	{//		return node != it.node;//	}//	//==运算符重载//	bool operator==(const list_const_iterator<T>& it)//	{//		return node == it.node;//	}//};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;iterator begin(){return iterator(head->next);}iterator end(){return iterator(head);}const_iterator begin() const {return const_iterator(head->next);}const_iterator end() const{return const_iterator(head);}size_t size(){return _size;}size_t size() const{return _size;}void empty_init(){head = new Node;head->prev = head;head->next = head;_size = 0;}//构造list(){empty_init();}//多参数初始化list(initializer_list<T> lt){empty_init();for (auto& e : lt){push_back(e);}}//深拷贝--->lt2(lt1)list(const list<T>& lt){empty_init();for (auto e : lt){push_back(e);}}//swap交换void swap(const list<T>& lt){std::swap(head, lt.head);std::swap(_size, lt._size);}//赋值运算符重载--->lt3 = lt1list<T>& operator=(const list<T> lt){swap(lt);return *this;}//尾插void push_back(const T& x){//Node* newnode = new Node(x);//Node* tail = head->prev;//newnode->prev = tail;//tail->next = newnode;//newnode->next = head;//head->prev = newnode;insert(end(), x);}//头插void push_front(const T& x){insert(begin(), x);}//头删void pop_front(){erase(begin());}//尾删void pop_back(){erase(--end());}//pos位置插入数据void insert(iterator pos, const T& x){Node* cur = pos.node;Node* prev = cur->prev;Node* newnode = new Node(x);prev->next = newnode;newnode->prev = prev;newnode->next = cur;cur->prev = newnode;++_size;}//erase删除指定位置节点iterator erase(iterator pos){assert(pos != end());Node* cur = pos.node;Node* PrevNode = cur->prev;Node* NextNode = cur->next;PrevNode->next = NextNode;NextNode->prev = PrevNode;delete cur;--_size;return iterator(NextNode);}//析构~list(){clear();delete head;head = nullptr;}//clear清除void clear(){iterator it = begin();while (it != end()){it = erase(it);}}private:Node* head;size_t _size;};
}
  • 后缀cpp代码
#include "list.h"
#include<algorithm>struct A
{A(int a1 = 1, int a2 = 1):_a1(a1),_a2(a2){ }int _a1;int _a2;
};void list_test1()
{TT::list<int> lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);TT::list<int>::iterator it = lt1.begin();while (it != lt1.end()){cout << *it << " ";++it;}cout << endl;
}void Print(const TT::list<A>& lt)
{TT::list<A>::const_iterator it = lt.begin();while (it != lt.end()){//it->_a1 += 1;cout << (*it)._a1 << " " << (*it)._a2 << endl;;++it;}cout << endl;
}void list_test2()
{TT::list<A> lt1;lt1.push_back({ 1,1 });lt1.push_back({ 2,2 });lt1.push_back({ 3,3 });lt1.push_back({ 4,4 });TT::list<A>::iterator it1 = lt1.begin();while (it1 != lt1.end()){//cout << (*it1)._a1 << ":" << (*it1)._a2 << endl;it1->_a1 += 1;cout << it1->_a1 << ":" << it1->_a2 << endl;++it1;}cout << endl;Print(lt1);
}void list_test3()
{TT::list<int> lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);for (auto e : lt1){cout << e << " ";}cout << endl;lt1.push_back(78);lt1.push_back(99);lt1.push_front(100);lt1.push_front(300);for (auto e : lt1){cout << e << " ";}cout << endl;lt1.pop_back();lt1.pop_front();for (auto e : lt1){cout << e << " ";}cout << endl;
}void test_list4()
{TT::list<int> lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);for (auto e : lt1){cout << e << " ";}cout << endl;TT::list<int> lt2(lt1);lt1.clear();for (auto e : lt1){cout << e << " ";}cout << endl;for (auto e : lt2){cout << e << " ";}cout << endl;TT::list<int> lt3 = lt2;for (auto e : lt3){cout << e << " ";}cout << endl;TT::list<int> lt4 = { 10,20,30,40 };for (auto e : lt4){cout << e << " ";}cout << endl;
}int main()
{//list_test1();//list_test2();//list_test3();test_list4();return 0;
}

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

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

相关文章

谷粒微服务高级篇学习笔记整理---异步线程池

多线程回顾 多线程实现的4种方式 1. 继承 Thread 类 通过继承 Thread 类并重写 run() 方法实现多线程。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("线程运行: " Thread.currentThread().getName());} }// 使用 pub…

Windows学习笔记(4)关于MITRE

基本术语 APT&#xff08;威胁组&#xff0c;高级持续威胁&#xff09; TTP&#xff08;攻击目的技术过程&#xff0c;战术技术和程序&#xff09; ATT&CK框架 网站 https://attack.mitre.org/ CAR知识库 MITRE Engage MITRE D3FEND 网址 https://d3fend.mitre.org/

Share01-WinCC文件越用越大?

为什么你们的经典WinCC项目在客户电脑上运行的越来越慢&#xff1f;为什么查询一个历史曲线慢的要死&#xff1f;为什么重启一下电脑画面都要怀疑人生&#xff1f;具体原因可能多种多样&#xff0c;但是极大可能是您的数据管理设置欠佳&#xff0c;那么闲话少叙&#xff0c;和小…

基于改进粒子群算法的多目标分布式电源选址定容规划(附带Matlab代码)

通过分析分布式电源对配电网的影响&#xff0c;以有功功率损耗、电压质量及分布式电源总容量为优化目标&#xff0c;基于模糊理论建立了分布式电源在配电网中选址定容的多目标优化模型&#xff0c;并提出了一种改进粒子群算法进行求解。在算例仿真中&#xff0c;基于IEEE-14标准…

雨云云应用测评!内测持续进行中!

大家好&#xff0c;时隔一个月&#xff0c;我们又见面了&#xff01; 最近&#xff0c;雨云推出了新型云应用&#xff08;RCA&#xff0c;Rainyun Cloud Application&#xff09;。 通过云应用&#xff0c;你可以快速创建可以外部访问的应用&#xff0c;采用全新的面板和dock…

【算法day25】 最长有效括号——给你一个只包含 ‘(‘ 和 ‘)‘ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

32. 最长有效括号 给你一个只包含 ‘(’ 和 ‘)’ 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 https://leetcode.cn/problems/longest-valid-parentheses/ 2.方法二&#xff1a;栈 class Solution { public:int longestValid…

C++编程学习笔记:函数相关特性、引用与编译流程

目录 一、函数的缺省参数 &#xff08;一&#xff09;全缺省参数 &#xff08;二&#xff09;半缺省参数 二、函数重载 &#xff08;一&#xff09;参数类型不同 &#xff08;二&#xff09;参数个数不同 &#xff08;三&#xff09;参数类型顺序不同 三、引用相关问题…

RPCGC阅读

24年的MM 创新 现有点云压缩工作主要集中在保真度优化上。 而在实际应用中&#xff0c;压缩的目的是促进机器分析。例如&#xff0c;在自动驾驶中&#xff0c;有损压缩会显着丢失户外场景的详细信息。在三维重建中&#xff0c;压缩过程也会导致场景数据中语义信息(Contour)的…

645.错误的集合

import java.util.HashMap; import java.util.Map;/*** program: Test* description: 645 错误的集合* author: gyf* create: 2025-03-23 10:22**/ public class Test {public static void main(String[] args) {}public static int[] findErrorNums(int[] nums) {int[] arr n…

一周学会Flask3 Python Web开发-SQLAlchemy数据迁移migrate

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 模型类(表)不是一成不变的&#xff0c;当你添加了新的模型类&#xff0c;或是在模型类中添加了新的字段&#xff0c;甚至是修改…

Python练习之抽奖界面

前言 一、代码整体架构分析 1、数据层 (Model) 2、控制层 (Controller) 3、视图层 (View) 二、核心功能实现详解 1、 文件导入功能 1.1、实现逻辑 1.2、代码涉及知识点讲解 1.2.1、wildcard 1.2.2、wx.FileDialog 1.2.3、dlg.ShowModal() 2、抽奖动画控制 1.1、…

【云原生】docker 搭建单机PostgreSQL操作详解

目录 一、前言 二、前置准备 2.1 服务器环境 2.2 docker环境 三、docker安装PostgreSQL过程 3.1 获取PostgreSQL镜像 3.2 启动容器 3.2.1 创建数据卷目录 3.2.2 启动pg容器 3.3 客户端测试连接数据库 四、创建数据库与授权 4.1 进入PG容器 4.2 PG常用操作命令 4.2…

算法为舟 思想为楫:AI时代,创作何为?

在科技浪潮汹涌澎湃的当下,AI技术以前所未有的态势席卷各个领域,创作领域亦未能幸免。当生成式AI展现出在剧本撰写、诗歌创作、图像设计等方面的惊人能力时,人类创作者仿佛置身于文明演化的十字路口,迷茫与困惑交织,兴奋与担忧并存。在AI时代,创作究竟该何去何从?这不仅…

JAVA的内存图理解

目录 一、方法区1、类常量池2、静态常量池3、方法区过程 二、栈三、堆1、字符常量池2、堆内存图的绘制 java中内存可以分为 方法区、 堆、 栈、 程序计数器、 本地方法栈&#xff0c;其中比较中重要的是方法区、堆、栈。 一、方法区 1.方法区&#xff08;Method Area&…

医疗CMS高效管理:简化更新维护流程

内容概要 医疗行业内容管理系统&#xff08;CMS&#xff09;的核心价值在于应对医疗信息管理的多维复杂性。面对诊疗指南的动态更新、科研数据的快速迭代以及多机构协作需求&#xff0c;传统管理模式往往面临效率瓶颈与合规风险。现代化医疗CMS通过构建结构化权限管理矩阵&…

低功耗LPWAN模块开发指南:远距离无线通信与边缘计算融合实战‌

在远程资产追踪、野外环境监测等场景中&#xff0c;稳定可靠的长距离通信与超低功耗是系统设计的核心挑战。eFish-SBC-RK3576通过 ‌原生双UART接口 USB OTG扩展能力‌ &#xff0c;可无缝集成主流LPWAN模组&#xff08;LoRa/NB-IoT&#xff09;&#xff0c;实现“数据采集-边…

迅为iTOP-RK3576人工智能开发板Android 系统接口功能测试

2.1 开机启动 开发板接通电源&#xff0c;并按下电源开关&#xff0c;系统即启动&#xff0c;在启动过程中&#xff0c;系统会显示下图中的开机画面&#xff0c;它们分别是 Android 系统启动时的 Logo 画面&#xff1a; 最后会显示如下解锁画面&#xff1a; 2.2 命令终端 将…

RAG基建之PDF解析的“无OCR”魔法之旅

PDF文件转换成其他格式常常是个大难题,大量的信息被锁在PDF里,AI应用无法直接访问。如果能把PDF文件或其对应的图像转换成结构化或半结构化的机器可读格式,那就能大大缓解这个问题,同时也能显著增强人工智能应用的知识库。 嘿,各位AI探险家们!今天我们将踏上了一段奇妙的…

二层框架组合实验

实验要求&#xff1a; 1,内网IP地址使用172.16.0.0/16分配 2,SW1和sw2之间互为备份 3,VRRP/STP/VLAN/Eth-trunk均使用 4,所有PC均通过DHCP获取IP地址 5,ISP只能配置IP地址 6,所有电脑可以正常访问ISP路由器环回 实验思路顺序&#xff1a; 创建vlan eth-trunk 划分v…

若依赖前端处理后端返回的错误状态码

【背景】 后端新增加了一个过滤器&#xff0c;用来处理前端请求中的session 若依赖存放过滤器的目录&#xff1a;RuoYi-Vue\ruoyi-framework\src\main\java\com\ruoyi\framework\security\filter\ 【问题】 后端返回了一个状态码为403的错误&#xff0c;现在前端需要处理这…