当前位置: 首页 > news >正文

怎样了解网站建设是否专业/网站搭建需要多少钱?

怎样了解网站建设是否专业,网站搭建需要多少钱?,广州专业网站优化公司,加盟招商网站建设方案vector模拟实现 一、看源代码简单实现1. push_backcapacity(容量)sizereserve(扩容)operator[ ] (元素访问) 2. pop_back3. itorator(迭代器)4.insert & erase (头插…

vector模拟实现

  • 一、看源代码
  • 简单实现
    • 1. push_back
      • capacity(容量)
      • size
      • reserve(扩容)
      • operator[ ] (元素访问)
    • 2. pop_back
    • 3. itorator(迭代器)
    • 4.insert & erase (头插头删)
    • 5. 拷贝构造和析构函数
      • default关键字(强制编译器生成)
    • 其他问题

一、看源代码

  • 在我们自己实现 vector 的时候,我们可以参考 vector 的源代码

在这里插入图片描述

  • 大致功能初步了解
    1. 成员变量
    1. 核心成员函数
  • 根据名字连蒙带猜,通过时间看源码细节确认

我们自定义的成员变量:

template<class T>
class vector
{
public:private:T* _a;size_t _size;size_t _capacity;
};

修改后:

namespace bit  //同一个域内,就不会和编译器里面的vector弄混
{template<class T>class vector{public:typedef T* iterator;private:iterator _start;iterator _finish;iterator _end_of_storage;};
}

简单实现

前情提要:我们分离定义不分离是因为分离会出现连接问题,这个我们后面会提到

1. push_back

在这里插入图片描述

下面是push-back的大致框架:

void push_back(const T& x)
{//如果满了就扩容if(_finish == _end_of_storage){//扩容}
}

注意:在这里我们还要实现三个前提函数:capacity()、size()、reserve()

capacity(容量)

size_t capacity()
{return _end_of_storage - _start;
}

size

size_t size()
{return _finish - _start;
}

reserve(扩容)

void reserve(size_t n)
{//直接扩容if (n > capacity()){T* tmp = new T[n];  //开辟空间memcpy(tmp, _start, sizeof(T) * size());  //拷贝delete[] _start; //释放旧空间_start = tmp;  //指向新空间}_finish = _start + size();_end_of_storage = _start + n;
}

⭐通过以上代码,我们就可以开始实现👇

void push_back(const T& x)
{//如果满了就扩容if (_finish == _end_of_storage){//如果capacity 是 0 那么就给四个空间,不是就乘二倍size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);}*_finish = x;++_finish;
}

在这里插入图片描述

operator[ ] (元素访问)

T& operator[](size_t i)
{assert(i < size());//断言检查越界情况return _start[i];
}

问题一:测试会发现,我们没有包iostream头文件,所以cout无法使用
在这里插入图片描述

  • 这里就涉及到一个问题 头文件 .h.cpp 文件里面会展开

所以当我们在Test.cpp里面展开vector.h时,又可以使用了
在这里插入图片描述

  • 因为展开时他会向上查找
    在这里插入图片描述
    在这里插入图片描述

但但但是,又有一个问题,运行报错了在这里插入图片描述

在这里插入图片描述

  • 空指针问题,通过测试,我们可以发现的是,size算法出现问题

start 是新的 但是 finish 是旧的

当我们重新扩容之后,_start == tmp , 而_ finish还是原来的那个t

在这里插入图片描述

  • 修改后代码如下:
void reserve(size_t n)
{//直接扩容if (n > capacity()){size_t oldsize = size();T* tmp = new T[n];  //开辟空间if (_start) {memcpy(tmp, _start, sizeof(T) * size());  //拷贝delete[] _start; //释放旧空间	}_start = tmp;  //指向新空间_finish = tmp + oldsize;_end_of_storage = _start + n;}}

2. pop_back

那么这个就比较简单了,代码实现如下👇:

void pop_back()
{assert(size() > 0);--_finish
}

3. itorator(迭代器)

  • 在没有迭代器的情况下时,我们是不能使用范围for的
    在这里插入图片描述
    迭代器代码实现👇
typedef T* iterator;
iterator begin()
{return _start;
}
iterator end()
{return _finish;
}

在这里插入图片描述

  • 当然,也有const迭代器
    是指迭代器指向的内容不可修改
typedef const T* const_iterator;iterator begin() const
{return _start;
}
iterator end() const
{return _finish;
}

4.insert & erase (头插头删)

在这里插入图片描述

void test_vector3()
{bit::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.insert(v1.begin(), 0); //头插v1.erase(v1.begin());  //头删
}

运行结果:
在这里插入图片描述
⭐insert的的实现

void insert(iterator pos, const T& x)
{if (_finish == _end_of_storage){size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;--end;}*pos = x;++_finish;
}

注意:这里的扩容会导致迭代器失效,本质上也是一种野指针,pos指向的位置已经失效了

在这里插入图片描述

  • 所以我们只需要将pos指向新空间对应的位置就好
    在这里插入图片描述
    修改后的insert👇
void insert(iterator pos, const T& x)
{if (_finish == _end_of_storage){size_t len = pos - _start;  //加上这一句计算pos的位置size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);pos = _start + len; //重置为新pos的位置}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;--end;}*pos = x;++_finish;
}
  • 紧接而来的问题,当我们调用自己写insert时,pos会失效,使得在后面不能重新在调用pos
insert(pos,100);

erase的实现代码👇

void erase(iterator pos)
{assert(pos >= _start);assert(pos <= _finish);iterator it = pos + 1;while (it != _finish){*(it - 1) = *it;**it;}--_finish;
}
  • 当我们使用erase但是也会出现失效的可能性,这也说明迭代器失效不只是野指针的问题

在这里插入图片描述

  • 这取决于VS的编译器对于iterator,我们出了作用域时,会类似标记为 false ,此时再次调用,就会报错
    在这里插入图片描述

5. 拷贝构造和析构函数

  • 拷贝构造
    问题一:如果我们不写拷贝构造的话,在VS里面默认是什么
    在内置类型里面,我们完成的是值拷贝,也就是所谓的浅拷贝,这不是我们所需要的

在这里插入图片描述
在这里插入图片描述

拷贝构造函数代码如下👇

void swap(vector<T>& v)
{std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);
}// v1 = v3
vector<T>& operator=(vector<T>& v)
{this->swap(v);return *this;
}
//v2(v1)
vector(const vector<T>& v)
{for (auto e : v){push_back(e);}
}//但是现在并没有写构造
  • 但是在这里并没有运行,所以在这里我们需要提前了解一下关键字

default关键字(强制编译器生成)

//强制编译器生成默认的
vector() = dafault;

析构函数代码如下👇

~vector()
{if (_start){delete[] _start;_start = _finish = _end_of_storage = nullptr;}
}

其他问题

  • 有人在编译的时候可能会出现内部编译器出错
  • 因为有模板的原因,编译器报错比较混乱
  • 一般都是少了分号的原因
  • 可以用分段注释的方法来解决

在这里插入图片描述

相关文章:

【vector模拟实现】附加代码讲解

vector模拟实现 一、看源代码简单实现1. push_backcapacity&#xff08;容量&#xff09;sizereserve&#xff08;扩容&#xff09;operator[ ] &#xff08;元素访问&#xff09; 2. pop_back3. itorator&#xff08;迭代器&#xff09;4.insert & erase &#xff08;头插…...

本地运行ChatTTS

TTS 是将文字转为语音的模型&#xff0c;最近很火的开源 TTS 项目&#xff0c;本地可以运行&#xff0c;运行环境 M2 Max&#xff0c;差不多每秒钟 4&#xff5e;&#xff5e;5 个字。本文将介绍如何在本地运行 ChatTTS。 下载源码 首先下载源代码 git clone https://github…...

应用解析 | 面向智能网联汽车的产教融合解决方案

背景介绍 随着科技的飞速发展&#xff0c;智能网联汽车已成为汽车产业的新宠&#xff0c;引领着未来出行的潮流。然而&#xff0c;行业的高速发展也带来了对高素质技术技能人才的迫切需求。为满足这一需求&#xff0c;推动教育链、人才链与产业链、创新链的深度融合&#xff0…...

华为设备动态路由OSPF(单区域+多区域)实验

动态路由OSPF的配置 OSPF分类两种情况&#xff1a;单区域 多区域路由 OSPF单区域路由配置 OSPF&#xff1a;开放最短路径优先的路由协议。属于大型动态路由协议&#xff0c;适用于中大型的园区网。 网络拓扑&#xff1a; 配置步骤&#xff1a; 1.完成基本配置&#xff08;略&a…...

R语言探索与分析19-CPI的分析和研究

一、选题背景 CPI&#xff08;居民消费价格指数&#xff09;作为一个重要的宏观经济指标&#xff0c;扮演着评估通货膨胀和居民生活水平的关键角色。在湖北省这个经济活跃的地区&#xff0c;CPI的波动对于居民生活、企业经营以及政府宏观经济政策制定都具有重要的影响。因此&a…...

【C++ | 拷贝构造函数】一文了解C++的 拷贝(复制)构造函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-07 2…...

【工具】Vmware17 安装mac(13.6.7)虚拟机

目录 0.简介 1.环境 2.详细步骤 2.1下载mac镜像&#xff08;可以选择你所需要的&#xff09; 2.2 VMware安装 1&#xff09;创建新的虚拟机 2&#xff09;选择【典型】&#xff0c;点击下一步 3&#xff09;选择【安装程序光盘映像文件】&#xff0c;点击浏览&#xff…...

mac node版本切换 nvm install nvm ls-remote N/A问题

mac 使用nvm 切换node版本失败或者 nvm install &nvm ls-remote N/A问题 一、出现情况 输入 nvm install v16.18.0输出结果 Version 16.18.0 not found try nvm is-remote•to browse available versions.输入 nvm ls-remote输出结果 N/A二、原因分析 1. 镜像包获取…...

牛客小白月赛95

vp&#xff0c;为后面的比赛做准备 A.相遇 #include <iostream> #include <vector> #include <algorithm> #include <set> #include <unordered_map> #include <cstring> #include <cstdio> #include <string> #include <…...

Python实现调用并执行Linux系统命令

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…...

古字画3d立体在线数字展览馆更高效便捷

在数字时代的浪潮中&#xff0c;大连图书馆以崭新的面貌跃然屏幕之上——3D全景图书馆。这座承载着城市文化精髓与丰富知识资源的数字图书馆&#xff0c;利用前沿的三维建模技术&#xff0c;为我们呈现了一个全新的知识世界。 随时随地&#xff0c;无论您身处何地&#xff0c;只…...

编写程序,提示用户输入以米/秒(m/s)为单位的速度v和以米/秒的平方(m/s)为单位的加速度 a,然后显示最短跑道长度。

(物理:求出跑道长度)假设一个飞机的加速度是a而起飞速度是v&#xff0c;那么可以使用下 面的公式计算出飞机起飞所需的最短跑道长度: 编写程序&#xff0c;提示用户输入以米/秒(m/s)为单位的速度v和以米/秒的平方(m/s)为单 位的加速度 a&#xff0c;然后显示最短跑道长度。下面…...

k8s 对外发布(ingress)

在k8s中&#xff0c;service的作用体现在两个方面&#xff0c;对集群内部&#xff0c;它不断跟踪pod的变化&#xff0c;更新endpoint中对应pod的对象&#xff0c;提供了ip不断变化的pod的服务发现机制&#xff1b; 对集群外部&#xff0c;他类似负载均衡器&#xff0c;可以在集…...

FL Studio21.2.7最新中文破解版免费激活,音乐制作全掌握!

在数字音乐制作的海洋中&#xff0c;你是否曾因软件的复杂操作、高昂费用而望而却步&#xff1f;是否梦想拥有一款既强大又亲民的音乐制作工具&#xff0c;让你的创作激情不受束缚&#xff1f;今天&#xff0c;让我们一起探索FL Studio21——这款官方中文破解激活码及免费版下载…...

2 - 寻找用户推荐人(高频 SQL 50 题基础版)

2.寻找用户推荐人 考点: sql里面的不等于&#xff0c;不包含null -- null 用数字判断筛选不出来 select name from Customer where referee_id !2 OR referee_id IS NULL;...

高考志愿填报有哪些技巧和方法

一年一度高考季&#xff0c;又高考志愿填报的时侯了。高考志愿填报的时侯&#xff0c;需要考虑的因素比较多&#xff0c;有的同学觉是离家越远越好&#xff0c;要放飞自我&#xff0c;家长再也管不了我了。有的同学觉得专业比学校牌子重要&#xff0c;只要报个好专业&#xff0…...

codereview时通常需要关注哪些

在团队成员之间互相进行代码审查&#xff08;codereview&#xff09;时&#xff0c;通常可以从以下几个方面来确保代码的质量和可维护性&#xff1a; 代码结构和格式&#xff1a; 检查代码是否遵循了项目约定的编码规范和风格指南。确保代码具有良好的可读性&#xff0c;比如合…...

DSP28335模块配置模板系列——定时器中断配置模板

一、配置步骤&#xff1a; 1.使能定时器时钟 EALLOW;SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK 1; // CPU Timer 2EDIS; 2.设置定时器的中断向量 EALLOW;PieVectTable.TINT2 &TIM2_IRQn;EDIS;其中TIM2_IRQn时定时器中断服务程序的名称 &#xff0c;将中断服务函数的地址…...

使用 Apache Commons Exec 自动化脚本执行实现 MySQL 数据库备份

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…...

【中间件系列】浅析redis是否适合做消息队列

文章目录 一、简单的list消息队列1.命令示例2.伪代码示例3.方案优劣 二、Pub/Sub发布订阅1.消息丢失2.消息堆积 三、相对成熟的Stream1.redis命令介绍2.多消费者组测试3.Stream会持久化吗&#xff1f;4.消息堆积如何解决&#xff1f; 总结 用redis也是比较久了&#xff0c;并且…...

[NOVATEK] NT96580行车记录仪功能学习笔记

一、u-Boot升级灯 运行u-Boot程序时LED灯闪烁,找到运行过程中一直在运行的函数在里面进行LED引脚电平的翻转 宏定义 Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\include\configs\nvt-na51055-evb.h Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\drivers\mtd\nvt_flash_…...

创新案例 | AI数据驱动下的全域数字化转型的五大关键洞见

近年来通过全域数字化转型在竞争激烈的市场中脱颖而出。传统零食行业面临市场竞争加剧和消费者需求多样化的挑战&#xff0c;如何利用数据驱动和AI技术&#xff0c;能更好地实现会员运营效率和用户满意度的显著提升呢&#xff1f;本文将探讨全域数字化转型的五大关键洞见&#…...

学习笔记——网络参考模型——TCP/IP模型(网络层)

三、TCP/IP模型-网络层 1、IPV4报头 (1)IPV4报文格式 IP Packet(IP数据包)&#xff0c;其包头主要内容如下∶ Version版本∶4 bit&#xff0c;4∶表示为IPv4; 6∶表示为IPv6。 Header Length首部长度∶4 bit&#xff0c;代表IP报头的长度(首部长度)&#xff0c;如果不带Opt…...

AI初识--LLM、ollama、llama都是些个啥?

LLM全称&#xff08;large language model&#xff09;也就是大语言模型 什么是Ollama&#xff0c;它与Llama是什么关系&#xff1f; Ollama是一个开源的 LLM&#xff08;大型语言模型&#xff09;服务工具&#xff0c;用于简化在本地运行大语言模型&#xff0c;降低使用大语…...

【全开源】JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码

&#xff1a;构建便捷出行新体验 一、引言&#xff1a;探索打车系统小程序源码的重要性 在数字化快速发展的今天&#xff0c;打车系统小程序已成为我们日常生活中不可或缺的一部分。它以其便捷、高效的特点&#xff0c;极大地改变了我们的出行方式。而背后的关键&#xff0c;…...

LeetCode 两数之和 + 三数之和

两数之和 简单题 思路&#xff1a;一个Map&#xff0c;key是数值&#xff0c;value是该数值对应的下标&#xff0c;遍历的时候判断一下当前数组下标对应的值在map里有没有可组合成target的&#xff08;具体体现为在map里找target-nums【i】)&#xff0c;如果有&#xff0c;直接…...

Switch刷机:安装Android系统和Linux系统

文章目录 Switch刷机解锁SwitchSwitchroot重要提示 安装Android系统安装Linux系统&#xff08;Ubuntu&#xff09;安装Lakka系统安装多系统&#xff08;和大气层系统、官方原生系统并存&#xff09; Switch刷机 解锁Switch 刷机的前提是要解锁bootloader&#xff0c;早期的NS…...

DeepDriving | 多目标跟踪算法之SORT

本文来源公众号“DeepDriving”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;多目标跟踪算法之SORT 1 简介 SORT是2016年发表的一篇文章《Simple Online and Realtime Tracking》中提出的一个经典的多目标跟踪算法&#xff0c;…...

实验演示方波是由正弦波叠加而成的

方波可以看成是由N个正弦波叠加而成&#xff0c;在数学上&#xff0c;方波可以写成这个式子&#xff0c;大家可以看到这个式子里面包含了无数个奇数次的正弦波。 下面通过运放构成的反相求和电路来看一下&#xff0c;正弦波叠加成方波 对于这个反相求和电路&#xff1a; Ui1是…...

进口电动流量调节阀的选型-美国品牌

进口电动流量调节阀的选型需要综合考虑多个因素&#xff0c;以确保所选阀门能够满足实际应用需求。以下是选型时需要考虑的主要方面&#xff1a; 一、明确应用需求 工作介质&#xff1a;了解介质的性质&#xff0c;包括流体类型、温度、压力以及是否具有腐蚀性或特殊性质。流…...