模拟实现vector:vector构造、析构函数、size、capacity、push_back函数、迭代器、[]运算符重载等的介绍

文章目录

  • 前言
  • 一、vecotr构造、析构函数、size、capacity、push_back函数、迭代器、[]运算符重载
  • 二、insert函数
  • 三、const修饰的迭代器
  • 总结


前言

模拟实现vector:vector构造、析构函数、size、capacity、push_back函数、迭代器、[]运算符重载等的介绍


一、vecotr构造、析构函数、size、capacity、push_back函数、迭代器、[]运算符重载

参考vector的源代码,vector的成员变量的结构:

private:iterator _start;iterator _finish;iterator _end_of_storage;

iterator为模板指针类型,通过typedef重命名。

  • vector的结构大致为如下:

在这里插入图片描述

#include <iostream>
#include <assert.h>using namespace std;namespace hhb
{template <class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;iterator begin() {return _start;}iterator end() {return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}vector(): _start(nullptr), _finish(nullptr), _end_of_storage(nullptr){}~vector(){delete[] _start;_start = _finish = _end_of_storage = nullptr;}void push_back(const T& x){size_t newcapacity = capacity() == 0 ? 4 : 2 * capacity();if (_finish == _end_of_storage){reserve(newcapacity);}*_finish = x;++_finish;}//void reserve(size_t n)//{//	if (n > capacity())//	{//		T* tmp = new T[n];//		memcpy(tmp, _start, sizeof(T) * size());//		delete[] _start;//		_finish = tmp + size();//		_start = tmp;//		_end_of_storage = _start + n;//	}//	//}void reserve(size_t n){if (n > capacity()){size_t sz = size();T* tmp = new T[n];memcpy(tmp, _start, sizeof(T) * sz);delete[] _start;_start = tmp;_finish = _start + sz;_end_of_storage = _start + n;}}size_t capacity() const{return _end_of_storage - _start;}size_t size() const{return _finish - _start;}private:iterator _start;iterator _finish;iterator _end_of_storage;};
}
  • resereve的经典小坑:
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;}
}

如上述的写法:
在这里插入图片描述

测试执行

#include "vector.h"void Test_vector1()
{hhb::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);for (size_t i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;hhb::vector<int>::iterator it = v1.begin();while (it != v1.end()){cout << *it << " ";++it;}cout << endl;for (auto e : v1){e++;cout << e << " ";}cout << endl;
}int main()
{Test_vector1();//Test_vector2();//Test_vector3();return 0;
}

在这里插入图片描述

二、insert函数

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

在这里插入图片描述

  • 这里会有一个迭代器失效的坑
    在这里插入图片描述

三、const修饰的迭代器

void print(const hhb::vector<int>& v)
{for (auto e : v){cout << e << " ";}cout << endl;
}
void Test_vector3()
{hhb::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);v1.push_back(6);v1.push_back(7);v1.push_back(8);print(v1);
}
  • 如上述的情况,print函数的参数经过了const修饰
  • 在函数内部使用范围for语法糖,所以必须要有const修饰的迭代器。

在这里插入图片描述


总结

模拟实现vector:vector构造、析构函数、size、capacity、push_back函数、迭代器、[]运算符重载等的介绍

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

拥塞控制算法为何失效,网络为何难以测量?

紧接着上文 如何测量一个(传输网络)系统的容量 给出的方法&#xff0c;看一下如何测量网络容量&#xff0c;如果真的能测量网络容量&#xff0c;传输算法就好设计了。 先给出答案&#xff0c;很遗憾&#xff0c;根本无法测量&#xff0c;请阅读 why we don’t know how to sim…

react-intl——react国际化使用方案

国际化介绍 i18n&#xff1a;internationalization 国家化简称&#xff0c;首字母首尾字母间隔的字母个数尾字母&#xff0c;类似的还有 k8s(Kubernetes) <br /> React-intl是 React 中最受欢迎的库。 使用步骤 安装 # use npm npm install react-intl -D # use yarn项目…

MySOL数据库进阶篇——存储引擎

一.MySQL体系结构图&#xff1a; MySQL的结构体系主要包含以下几个方面的内容&#xff1a; 1. 服务器层&#xff08;Server Layer&#xff09;&#xff1a;提供了MySQL的核心服务&#xff0c;包括连接管理、查询解析、优化等功能。 2. 存储引擎&#xff08;Storage Engine&am…

每日OJ_牛客_点击消除(栈)

目录 牛客_点击消除&#xff08;栈&#xff09; 解析代码 牛客_点击消除&#xff08;栈&#xff09; 点击消除_牛客题霸_牛客网 描述&#xff1a; 牛牛拿到了一个字符串。 他每次“点击”&#xff0c;可以把字符串中相邻两个相同字母消除&#xff0c;例如&#xff0c;字符…

图表类型识别系统源码分享

图表类型识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

Mysql的高级查询:SQL关联查询(内连接/外连接/自连接)/子查询

一.关联查询&#xff1a; 定义&#xff1a;关联查询又叫连接查询 常见&#xff1a;内连接/外连接/自连接 1.内连接(无存在主从表&#xff09; 语法&#xff1a;inner join ...on 定义&#xff1a;组合两个表的记录&#xff0c;返回关联字段相符的记录&#xff0c;也就是返…

Cryptography and Network Security: Principles and Practice(Lesson 2 notes)

Playfair Cipher Operation steps Construct a 55 letter matrix based onThe matrix is ​​constructed using a keyword (key)Then from left to right, from top to bottom; fill in the letters of the key in sequence (note: repeated letters in the key are not fil…

Open-Sora代码详细解读(2):时空3D VAE

Diffusion Models视频生成 前言&#xff1a;目前开源的DiT视频生成模型不是很多&#xff0c;Open-Sora是开发者生态最好的一个&#xff0c;涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发&#xff0c;深…

嵌入式软件黑盒测试技术与案例分析培训

黑盒测试&#xff0c;也称为基于需求的测试&#xff0c;是目前嵌入式软件领域普遍开展的一种测试过程。目前&#xff0c;随着人们对软件质量要求的不断提升&#xff0c;行业对软件测试和验证的要求也在不断提高&#xff0c;对测试的充分性和准确性要求越来越苛刻。当前行业内&a…

物联网平台架构图

在数字化时代&#xff0c;物联网&#xff08;IoT&#xff09;正逐渐成为连接物理世界与数字世界的桥梁。物联网架构&#xff0c;作为这一桥梁的核心&#xff0c;是一个多层次、分布式的网络系统&#xff0c;它通过将各种物理设备与传感器连接到互联网上&#xff0c;实现设备之间…

GLSL 棋盘shader

今日永杰开金 float size 100.;vec2 checkerboard mod(floor(gl_FragCoord.xy / size), 2.);float c mod(checkerboard.x checkerboard.y, 2.);gl_FragColor vec4(vec3(c), 1);或 vec2 uv floor(S * p.xy * vec2(iResolution.x / iResolution.y, 1) / iResolution.xy); …

华为SMU02B1管理模块WEB登录与账户密码信息

1、将电脑的IP地址与SMU02B1的IP地址配置在同一个网段中。例如&#xff0c;如果监控的IP地址为192.168.0.11&#xff0c;子网掩码为255.255.255.0&#xff0c;默认网关为192.168.0.1&#xff0c;则电脑的IP地址设置成192.168.0.12&#xff0c;子网掩码设置成255.255.255.0&…

Python+Pytest框架,“conftest.py文件编写如何获取token和获取日志“?

1、新增"conftest.py" import pytest import loggingfrom api_keyword.api_key import ApiKey from config import *# 获取token # 1. 正常的请求对应的接口并且提取数据 # 2. pytest.fixture()测试夹具&#xff08;测试前置、后置操作&#xff09;pytest.fixture(s…

ESP32开发 -- VSCODE+PlatformIO环境安装

参看官网安装&#xff1a;PlatformIO IDE for VSCode 一、安装PlatformIO IDE 参看&#xff1a;日常生活小技巧 – Visual Studio Code 简单使用 扩展中搜索platformIO IDE 当安装完提示重启之后。 打开一个要创建新工程的文件夹&#xff1a; 点击 Create New Project&…

【高等数学学习记录】函数

【高等数学&学习记录】函数 从事测绘工作多年&#xff0c;深刻感受到基础知识的重要及自身在这方面的短板。 为此&#xff0c;打算重温测绘工作所需基础知识。练好基本功&#xff0c;为测绘工作赋能。 1 知识点 1.1 函数 设数集 D ⊂ R D\subset R D⊂R&#xff0c;称映射…

java开发中间件学习记录(持续更新中~)

1 Redis 2JVM 3 java基础底层 4Mysql 5 spring 6 微服务 7.......(持续更新) One:Redis篇 1:Redis 1.穿透 1.1缓存穿透 1.1.1布隆过滤器 1.2缓存击穿 2&#xff1a;击穿 1.3&#xff1a;缓存雪崩 1.4:双写一致 1.5.持久化&#xff08;RDB,AOF&#xff09; 1.6…

电脑桌面数据误删如何恢复?提供一份实用指南

电脑桌面作为我们工作和学习的主要界面&#xff0c;存放着大量重要的文件。一旦这些数据不慎被删除&#xff0c;不仅会影响我们的工作效率&#xff0c;还可能造成无法挽回的损失。幸运的是&#xff0c;通过一些有效的方法&#xff0c;我们有机会恢复这些误删的桌面数据。本文将…

Leetcode面试经典150题-79.搜索单词

题目比较简单&#xff0c;回溯最基础的题&#xff0c;记得除非覆盖&#xff0c;否则一定要恢复现场就行 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public boolean exist(char[][] board, String word) {int m board.length; int n board[0].length;i…

AI周报(9.8-9.14)

AI应用-NEKO Health用AI颠覆体检 Neko Health 由 Spotify 创始人丹尼尔埃克和哈亚尔马尔尼尔森共同创立&#xff0c;致力于通过每年的全身扫描和由 AI 驱动的洞察力来改善预防性医疗保健&#xff0c;能够检测诸如心脏病和皮肤癌等疾病。 该公司通过使用人工智能软件支持的全身…

基于Python的量化交易回测框架Backtrader初识记录(二)

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;基于Python的量化交易回测框架Backtrader初识记录&#xff08;二&#xff09;-CSDN博客 前言&#xff1a;在上一篇文章 基于Python的量化交易回测框架Backtrader初识记录&#xff08;一…