企业网站建设方案百度文库/哪家公司做seo

企业网站建设方案百度文库,哪家公司做seo,建造师官网查询系统,做国外购物的网站怎么发货目录 1.模拟代码全部 2.四大块代码理解 1.最底层&#xff1a;ListNode部分 2.第二层&#xff1a;ListIterator部分 3.第三层&#xff1a;ReserveListIterator部分 4最终层&#xff1a;List 1.模拟代码全部 using namespace std; template<class T> struct ListNode …

目录

1.模拟代码全部

2.四大块代码理解

1.最底层:ListNode部分

2.第二层:ListIterator部分

3.第三层:ReserveListIterator部分

 4最终层:List


1.模拟代码全部

using namespace std;
template<class T>
struct ListNode
{T _Val;ListNode<T>* Prev;ListNode<T>* Next;ListNode(T Val=T()){Prev = nullptr;Next = nullptr;_Val = Val;}
};
template<class T, class Ref, class Ptr>
class ListIterator
{
public:typedef ListNode<T> Node;typedef ListIterator<T, Ref, Ptr> Self;typedef Ref Ref;typedef Ptr Ptr;ListIterator(Node* _NODE = nullptr) :_node(_NODE){}Ptr operator->(){return &(operator*());}Ref operator*(){return _node->_Val;}Self& operator++(){_node = _node->Next;return *this;}Self operator++(int){Node* Newnode = _node;_node = _node->Next;return Newnode;}Self& operator--(){_node = _node->Prev;return *this;}Self operator--(int){Node* Newnode = _node;_node = _node->Prev;return Newnode;}bool operator==(const Self& I) const{if (I._node == _node){return true;}else{return false;}}bool operator!=(const Self& I)const{if (I._node != _node){return true;}else{return false;}}Node* _node;
};
template<class Iterator>
class ReserveListIterator
{
public:typedef typename Iterator::Ptr Ptr;typedef typename Iterator::Ref Ref;typedef ReserveListIterator<Iterator> Self;ReserveListIterator(Iterator it):_it(it){}Ref operator*(){Iterator temp(_it);temp--;return *temp;}Ptr operator->(){return &(operator*());}Self operator++(){_it++;return *this;}Self operator++(int){Iterator temp(_it);_it++;return *temp;}Self operator--(){_it--;return *this;}Self operator--(int){Iterator temp(_it);_it--;return *temp;}bool operator == (const Self & I) const{if (I._it==_it){return true;}else{return false;}}bool operator !=(const Self& I)const{if (I._it != _it){return true;}else{return false;}}Iterator _it;
};
template<class T>
class List
{typedef ListNode<T> Node;typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&, const T*> const_iterator;typedef ReserveListIterator<iterator> reverse_iterator;typedef ReserveListIterator<const_iterator> const_reverse_iterator;
public:List(){creathead();}List(int n,const T& Value=T()){creathead();for (int i = 0; i < n; i++){push_back(Value);}}template <class Iterator>List(Iterator first, Iterator last){creathead();while (first != last){push_back(*first);first++;}}List(const List<T>& l){creathead();List<T>temp(l.begin(), l.end());this->swap(temp);}List<T>& operator=(List<T> l){List<T>temp(l);this->swap(temp);return *this;}~List(){clear();delete _head;_head = nullptr;}iterator begin(){return _head->Next;}iterator end(){return _head;}const_iterator begin()const{return _head->Next;}const_iterator end()const{return _head;}reverse_iterator rbegin(){return reverse_iterator(begin());}reverse_iterator rend(){return reverse_iterator(end());}const_reverse_iterator rbegin()const{return const_reverse_iterator(begin());}const_reverse_iterator rend()const{return const_reverse_iterator(end());}size_t size()const{size_t num = 0;Node* CUR = _head->Next;while (CUR != _head){num++;CUR = CUR->Next;}return num;}bool empty()const{if (begin() == end()){return true;}else{return false;}}void resize(size_t newsize, const T& data = T()){if (newsize > size()){Node* it = end();it = it->Prev;for (size_t i = size(); i < newsize; i++){Node* cur = new Node(data);cur->Next = it->Next;cur->Prev = it;it->Next = cur;}}else{Node* it = end();size_t len = size() - newsize;while (len--){Node* cur = it;it = it->Prev;delete cur;}it->Next = _head;_head->Prev = it;}}T& front(){return *begin();}const T& front()const{return *begin();}T& back(){iterator it = end();it--;return *it;}const T& back()const{iterator it = end();it--;return *it;}void push_back(const T& val){Node* Newnode = new Node(val);Node* cur = _head->Prev;cur->Next = Newnode;_head->Prev = Newnode;Newnode->Next = _head;Newnode->Prev = cur;}void pop_back(){Node* cur = _head->Prev->Prev;Node* popnode = _head->Prev;cur->Next = _head;_head->Prev = cur;delete popnode;}void push_front(const T& val){Node* cur = _head->Next;Node* newnode = new Node(val);_head->Next = newnode;cur->Prev = newnode;newnode->Next = cur;newnode->Prev = _head;}void pop_front(){Node* cur = _head->Next->Next;Node* popnode = _head->Next;_head->Next = cur;cur->Prev = _head;delete popnode;}iterator insert(iterator pos, const T& val){Node* pre = pos._node->Prev;Node* nect = pos._node;Node* newnode = new Node(val);newnode->Prev = pre;newnode->Next = nect;pre->Next = newnode;nect->Prev = newnode;return newnode;}iterator erase(iterator pos){Node* cur = pos._node;Node* prev = cur->Prev;Node* next = cur->Next;delete cur;prev->Next = next;next->Prev = prev;return next;}void clear(){size_t sz = this->size();while (sz--){Node* cur = _head->Next;Node* pop;}}void swap(List<T>& l){Node* temp = l._head;l._head = _head;_head = temp;}void creathead(){_head = new Node(0);_head->Prev = _head;_head->Next = _head;}
private:Node* _head;
};

2.四大块代码理解

代码一共分为四块,我们分开来理解

1.最底层:ListNode部分

这里是最简单的部分,小伙伴们应该都看的懂吧

using namespace std;
template<class T>
struct ListNode
{T _Val;ListNode<T>* Prev;ListNode<T>* Next;ListNode(T Val=T()){Prev = nullptr;Next = nullptr;_Val = Val;}
};

 这里我们形象点记忆

其实应该不用赘述多了,基础好的同学看到这张图应该就差不多懂了。 

唯一要注意的是

T Val=T()

>>    T()表示对类型T进行值初始化,生成一个临时的右值

>>    如果T是内置类型(如int,double,char等),则T()会执行零初始化,即返回0,0.0或'\0'等默认值。

>>    如果T是类类型,则T()会调用默认构造函数(如果存在)

聪明的小伙伴已经理解清楚了

2.第二层:ListIterator部分

聪明的小伙伴应该看代码就能懂了

那么我在这下方陈述了一些难点和易错点 

template<class T, class Ref, class Ptr>
class ListIterator
{
public:typedef ListNode<T> Node;typedef ListIterator<T, Ref, Ptr> Self;typedef Ref Ref;typedef Ptr Ptr;ListIterator(Node* _NODE = nullptr) :_node(_NODE){}Ref operator*(){return _node->_Val;}Self& operator++(){_node = _node->Next;return *this;}Self operator++(int){Node* Newnode = _node;_node = _node->Next;return Newnode;}Self& operator--(){_node = _node->Prev;return *this;}Self operator--(int){Node* Newnode = _node;_node = _node->Prev;return Newnode;}bool operator==(const Self& I) const{if (I._node == _node){return true;}else{return false;}}bool operator!=(const Self& I)const{if (I._node != _node){return true;}else{return false;}}Node* _node;
};

聪明的小伙伴应该看代码就能懂了

那么我在这陈述一下一些难点和易错点 

>>    typedef Ref Ref和typedef Ptr Ptr,简单来说,我们需要让编译器知道Listiterator里面有Ptr和 Ref,后面的反向迭代器ReserveListIterator来使用Listiterator的Ref和Ptr

>>    Ref:Ref在后面我们会通过T&来填充这块模板,也就是说Ref就是引用

>>    Ptr:Ptr在后面我们会通过T*来填充这块模板,也就是说Ptr就是指针

3.第三层:ReserveListIterator部分

聪明的小伙伴直接看代码

template<class Iterator>
class ReserveListIterator
{
public:typedef typename Iterator::Ptr Ptr;typedef typename Iterator::Ref Ref;typedef ReserveListIterator<Iterator> Self;ReserveListIterator(Iterator it):_it(it){}Ref operator*(){Iterator temp(_it);temp--;return *temp;}Ptr operator->(){return &(operator*());}Self operator++(){_it++;return *this;}Self operator++(int){Iterator temp(_it);_it++;return *temp;}Self operator--(){_it--;return *this;}Self operator--(int){Iterator temp(_it);_it--;return *temp;}bool operator == (const Self & I) const{if (I._it==_it){return true;}else{return false;}}bool operator !=(const Self& I)const{if (I._it != _it){return true;}else{return false;}}Iterator _it;
};

 

>>    之前我们在ListIterator里重新定义了Ptr和Ref参数就是留在ReserveListIterator使用

 

这里要注意一定不要写成Iterator &,本人之前就因为这个错误导致费了1小时/(ㄒoㄒ)/~~ 

 4最终层:List

牛人已经看代码就懂了

template<class T>
class List
{typedef ListNode<T> Node;typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&, const T*> const_iterator;typedef ReserveListIterator<iterator> reverse_iterator;typedef ReserveListIterator<const_iterator> const_reverse_iterator;
public:List(){creathead();}List(int n,const T& Value=T()){creathead();for (int i = 0; i < n; i++){push_back(Value);}}template <class Iterator>List(Iterator first, Iterator last){creathead();while (first != last){push_back(*first);first++;}}List(const List<T>& l){creathead();List<T>temp(l.begin(), l.end());this->swap(temp);}List<T>& operator=(List<T> l){List<T>temp(l);this->swap(temp);return *this;}~List(){clear();delete _head;_head = nullptr;}iterator begin(){return _head->Next;}iterator end(){return _head;}const_iterator begin()const{return _head->Next;}const_iterator end()const{return _head;}reverse_iterator rbegin(){return reverse_iterator(begin());}reverse_iterator rend(){return reverse_iterator(end());}const_reverse_iterator rbegin()const{return const_reverse_iterator(begin());}const_reverse_iterator rend()const{return const_reverse_iterator(end());}size_t size()const{size_t num = 0;Node* CUR = _head->Next;while (CUR != _head){num++;CUR = CUR->Next;}return num;}bool empty()const{if (begin() == end()){return true;}else{return false;}}void resize(size_t newsize, const T& data = T()){if (newsize > size()){Node* it = end();it = it->Prev;for (size_t i = size(); i < newsize; i++){Node* cur = new Node(data);cur->Next = it->Next;cur->Prev = it;it->Next = cur;}}else{Node* it = end();size_t len = size() - newsize;while (len--){Node* cur = it;it = it->Prev;delete cur;}it->Next = _head;_head->Prev = it;}}T& front(){return *begin();}const T& front()const{return *begin();}T& back(){iterator it = end();it--;return *it;}const T& back()const{iterator it = end();it--;return *it;}void push_back(const T& val){Node* Newnode = new Node(val);Node* cur = _head->Prev;cur->Next = Newnode;_head->Prev = Newnode;Newnode->Next = _head;Newnode->Prev = cur;}void pop_back(){Node* cur = _head->Prev->Prev;Node* popnode = _head->Prev;cur->Next = _head;_head->Prev = cur;delete popnode;}void push_front(const T& val){Node* cur = _head->Next;Node* newnode = new Node(val);_head->Next = newnode;cur->Prev = newnode;newnode->Next = cur;newnode->Prev = _head;}void pop_front(){Node* cur = _head->Next->Next;Node* popnode = _head->Next;_head->Next = cur;cur->Prev = _head;delete popnode;}iterator insert(iterator pos, const T& val){Node* pre = pos._node->Prev;Node* nect = pos._node;Node* newnode = new Node(val);newnode->Prev = pre;newnode->Next = nect;pre->Next = newnode;nect->Prev = newnode;return newnode;}iterator erase(iterator pos){Node* cur = pos._node;Node* prev = cur->Prev;Node* next = cur->Next;delete cur;prev->Next = next;next->Prev = prev;return next;}void clear(){size_t sz = this->size();while (sz--){Node* cur = _head->Next;Node* pop;}}void swap(List<T>& l){Node* temp = l._head;l._head = _head;_head = temp;}void creathead(){_head = new Node(0);_head->Prev = _head;_head->Next = _head;}
private:Node* _head;
};

 这里要注意一下转换顺序,listnode不能直接转换为reverse_iterator 

listnode转换为reverse_iterator需要两个个过程

 

 易错点难点就是以上那么多了,说多了只会妨碍小伙伴们,通过自己学习效率才是最高的。

3.测试代码 

#include"LList.h"
#include<iostream>
void ListPrint(List<int> it)
{auto i = it.begin();while(i!=it.end()){cout << *i << " ";i++;}
}
void TestBiteList1()
{int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };List<int> l3(array, array + sizeof(array) / sizeof(array[0]));ListPrint(l3);ListIterator<int, int&, int*> it(l3.begin());}
void TestBiteList2()
{List<int> l;l.push_back(1);l.push_back(2);l.push_back(3);ListPrint(l);l.pop_back();l.pop_back();ListPrint(l);l.pop_back();cout << l.size() << endl;l.push_front(1);l.push_front(2);l.push_front(3);ListPrint(l);l.pop_front();l.pop_front();ListPrint(l);l.pop_front();cout << l.size() << endl;
}
void TestBiteList3()
{int array[] = { 1, 2, 3, 4, 5 };List<int> l(array, array + sizeof(array) / sizeof(array[0]));auto pos = l.begin();l.insert(l.begin(), 0);ListPrint(l);++pos;l.insert(pos, 2);ListPrint(l);l.erase(l.begin());l.erase(pos);ListPrint(l);cout << *pos << endl;auto it = l.begin();while (it != l.end()){it = l.erase(it);}cout << l.size() << endl;
}
void TestBiteList4()
{int array[] = { 1, 2, 3, 4, 5 };List<int> l(array, array + sizeof(array) / sizeof(array[0]));auto rit = l.rbegin();while (rit != l.rend()){cout << *rit << " ";++rit;}cout << endl;const List<int> cl(l);auto crit = l.rbegin();while (crit != l.rend()){cout << *crit << " ";++crit;}cout << endl;
}
int main()
{TestBiteList1();TestBiteList2();TestBiteList3();TestBiteList4();
}

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

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

相关文章

【深度学习与实战】2.1、线性回归模型与梯度下降法先导

import numpy as np# 数据准备 X np.array([1, 2, 3]) y np.array([3, 5, 7])# 参数初始化 w0, w1 0, 0 alpha 0.1 n len(X)# 迭代10次 for epoch in range(10):# 计算预测值y_pred w1 * X w0# 计算梯度grad_w0 (1/n) * np.sum(y_pred - y)grad_w1 (1/n) * np.sum((y_…

sqlmap 源码阅读与流程分析

0x01 前言 还是代码功底太差&#xff0c;所以想尝试阅读 sqlmap 源码一下&#xff0c;并且自己用 golang 重构&#xff0c;到后面会进行 ysoserial 的改写&#xff1b;以及 xray 的重构&#xff0c;当然那个应该会很多参考 cel-go 项目 0x02 环境准备 sqlmap 的项目地址&…

vscode连接服务器失败问题解决

文章目录 问题描述原因分析解决方法彻底删除VS Code重新安装较老的版本 问题描述 vscode链接服务器时提示了下面问题&#xff1a; 原因分析 这是说明VScode版本太高了。 https://code.visualstudio.com/docs/remote/faq#_can-i-run-vs-code-server-on-older-linux-distribu…

flutter-实现瀑布流布局及下拉刷新上拉加载更多

文章目录 1. 效果预览2. 结构分析3. 完整代码4. 总结 1. 效果预览 在 Flutter 应用开发中&#xff0c;瀑布流布局常用于展示图片、商品列表等需要以不规则但整齐排列的内容。同时&#xff0c;下拉刷新和上拉加载更多功能&#xff0c;能够极大提升用户体验&#xff0c;让用户方…

4.用 Excel 录入数据

一 用 Excel 录入数据的两种方式 用鼠标键盘录入数据和从网上爬取数据。 二 用鼠标键盘录入数据 1.录入数据的规范 横着录入数据&#xff08;横着一条条录入数据&#xff09;。 2.使用快捷键进行数据录入 tab 键和 enter 键。 tab 键&#xff1a;向右移动一个单元格。 tab 键…

Android读写权限分析

Android系统使用的是Linux内核&#xff0c;所以Android系统沿用了linux系统的那一套文件读写权限。 目录 1&#xff0c;权限解读1.1&#xff0c;权限分为三种类型&#xff1a;1.2&#xff0c;权限针对的三类对象&#xff1a;1.3&#xff0c;文件和目录的权限区别1.3.1&#xf…

关于Qt的各类问题

目录 1、问题&#xff1a;Qt中文乱码 2、问题&#xff1a;启动时避免ComBox控件出现默认值 博客会不定期的更新各种Qt开发的Bug与解决方法,敬请关注! 1、问题&#xff1a;Qt中文乱码 问题描述&#xff1a;我在设置标题时出现了中文乱码 this->setWindowTitle("算法…

关于我对接了deepseek之后部署到本地将数据存储到mysql的过程

写在前面 今天写一下使用nodejs作为服务端&#xff0c;vue作为客户端&#xff0c;mysql的数据库&#xff0c;对接deepseek的全过程&#xff0c;要实现一个很简单的效果就是&#xff0c;可以自由的询问&#xff0c;然后可以将询问的过程存储到mysql的数据库中。 文档对接 deeps…

游戏引擎学习第182天

回顾和今天的计划 昨天的进展令人惊喜&#xff0c;原本的调试系统已经被一个新的系统完全替换&#xff0c;新系统不仅能完成原有的所有功能&#xff0c;还能捕获完整的调试信息&#xff0c;包括时间戳等关键数据。这次的替换非常顺利&#xff0c;效果很好。 今天的重点是在此基…

CSS终极指南:从基础到高级实践

目录 一、CSS基础概念与核心语法 1.1 CSS的本质与作用 1.2 CSS语法结构 二、CSS与HTML结合的四种方式 2.1 内联样式&#xff08;Inline Style&#xff09; 2.2 内部样式表&#xff08;Internal Style Sheet&#xff09; 2.3 外部样式表&#xff08;External Style Sheet…

Qt弹出新窗口并关闭(一个按钮)

参考&#xff1a;Qt基础 练习&#xff1a;弹出新窗口并关闭的两种实现方式&#xff08;两个按钮、一个按钮&#xff09;_qt打开一个窗口另一个关闭-CSDN博客 实现&#xff1a; 一个按钮&#xff0c;点击一次&#xff0c;按钮的名字从open window变为close window&#xff0c;…

PHP中yield关键字的使用

PHP版本>5.5 原理&#xff1a;yield关键字会生成一个Generator类的对象&#xff0c;PHP通过Generator实例计算出下一次迭代的值&#xff0c;再次返回一个Generator对象并停止循环&#xff08;即循环一次执行一次&#xff09;。 理解&#xff1a;使用在for/foreach/while循…

SpringBoot集成腾讯云OCR实现身份证识别

OCR身份证识别 官网地址&#xff1a;https://cloud.tencent.com/document/product/866/33524 身份信息认证&#xff08;二要素核验&#xff09; 官网地址&#xff1a;https://cloud.tencent.com/document/product/1007/33188 代码实现 引入依赖 <dependency><…

Tabby 一:如何在Mac配置保姆级教程(本地模型替换hugging face下载)

1. brew安装 mac需要先安装brew&#xff0c;如果本地已经安装过brew这一步可以忽略&#xff0c;遇到问题可以自己ai问 /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 可能遇到source .zprofile失败&#xff0c;因为…

C++中使用CopyFromRecordset将记录集拷贝到excel中时,如果记录集为0个,函数崩溃,是什么原因

文章目录 原因分析解决方案1. 检查记录集是否为空2. 安全调用COM方法3.进行异常捕获4. 替代方案&#xff1a;手动处理空数据 总结 在C中使用CopyFromRecordset将空记录集&#xff08;0条记录&#xff09;复制到Excel时崩溃的原因及解决方法如下&#xff1a; 原因分析 空记录集…

【算法学习计划】贪心算法(上)

目录 前言&#xff08;什么是贪心&#xff09; leetcode 860.柠檬水找零 leetcode 2208.将数组和减半的最少操作次数 leetcode 179.最大数 leetcode 376.摆动序列 leetcode 300.最长递增子序列 leetcode 334.递增的三元子序列 leetcode 674.最长连续递增序列 leetcode …

PC名词解释-笔记本的S0,S1,S2,S3,S4,S5状态

​&#x1f393;作者简介&#xff1a;程序员转项目管理领域优质创作者 &#x1f48c;个人邮箱&#xff1a;[2707492172qq.com] &#x1f310;PMP资料导航&#xff1a;PM菜鸟&#xff08;查阅PMP大纲考点&#xff09; &#x1f4a1;座右铭&#xff1a;上善若水&#xff0c;水善利…

Elasticsearch:使用 AI SDK 和 Elastic 构建 AI 代理

作者&#xff1a;来自 Elastic Carly Richmond 你是否经常听到 AI 代理&#xff08;AI agents&#xff09;这个词&#xff0c;但不太确定它们是什么&#xff0c;或者如何在 TypeScript&#xff08;或 JavaScript&#xff09;中构建一个&#xff1f;跟我一起深入了解 AI 代理的概…

5G智慧工厂专网部署:IPLOOK助力制造业数字化转型

5G专网 随着工业4.0时代的到来&#xff0c;制造业对高效、低延迟和智能化网络的需求日益增长。5G专网凭借其高速率、低时延和大连接特性&#xff0c;成为智慧工厂数字化转型的重要支撑。IPLOOK作为全球领先的移动核心网解决方案提供商&#xff0c;基于自身强大的5G核心网产品和…

第六届 蓝桥杯 嵌入式 省赛

参考 第六届蓝桥杯嵌入式省赛程序设计题解析&#xff08;基于HAL库&#xff09;_蓝桥杯嵌入式第六届真题-CSDN博客 一、分析功能 RTC 定时 1&#xff09;时间初始化 2&#xff09;定时上报电压时间 ADC测量 采集电位器的输出电压信号。 串行功能 1&#xff09;传送要设置…