C++ ─── vector的实现

知识点:

        ① 因为vector是模版,所以声明和定义都放在.h中,防止出现编译错误

        .h不会被编译,在预处理中.h在.cpp中展开所以在编译时只有.cpp

        而 .cpp顺序编译,只会进行向上查找,因此至少有函数的声明。

        ②memcpy的复习

        memcpy(dest , source,大小)

        ③ 拷贝构造也是构造函数(拷贝构造函数我们必须写,我们写的是深拷贝)
        但是有了拷贝构造函数,编译器就不会自己生成构造函数了,
        因为拷贝构造也是构造函数的一种,所以要强制生成
        强制编译器生成默认的构造函数,使用参数的缺省值生成默认构造函数
        vector() = default;

        ④拷贝构造函数和赋值重载函数的现代写法

        ⑤扩容之后,迭代器失效问题

目录

vector.h

test.cpp


vector.h

#pragma once
#include<iostream>
#include<assert.h>
#include<algorithm>namespace bit
{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;}size_t size()const{return _finish - _start;}size_t capacity() const{return _end_of_storage - _start;}//用迭代器区间构造函数//vector<int> v2(v1.begin() + 1, v1.end());//函数模板,写的不是iterator ,目的支持任意容器的迭代器 eg: list<int>的迭代器template<class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);++first;}}//构造函数,没必要自己写//vector()//:_start(nullptr)//,_finish(nullptr)//,_end_of_storage(nullptr)//{}// 拷贝构造也是构造函数(拷贝构造函数我们必须写,我们写的是深拷贝)// 但是有了拷贝构造函数,编译器就不会自己生成构造函数了,//因为拷贝构造也是构造函数的一种,所以要强制生成// 强制编译器生成默认的构造函数,使用参数的缺省值构造vector() = default;//n个value的构造函数//vector(10,10)// C++对内置类型也补充了内置类型的构造函数,看下面的test5中j=0// std::string s1("c");//vector(20,s1)vector(size_t n, const T& value = T())//T()代表用默认构造函数生成的匿名对象{reserve(n);//提高效率for (size_t i = 0; i < n; i++){push_back(value);}}//vector<int>v4(10, 1);//解决编译器的选择问题vector(int n, const T& value = T()){reserve(n);//提高效率for (int i = 0; i < n; i++){push_back(value);}}//拷贝构造函数//vector<int> v3(v2);vector(const vector<T>& v2){reserve(v2.capacity());for (auto e: v2){push_back(e);}}//赋值重载函数(利用形参时的拷贝构造生成的临时对象)//v3= v2;vector<T>& operator=( vector<T> v)//v是v2的临时拷贝,只需要将v3变成v即可(现代写法){swap(v);return *this;}//析构函数~vector(){if (_start){delete[]_start;_start = _finish = _end_of_storage = nullptr;}}void reserve(size_t n){if (n > capacity()){size_t old_size = size();T* tmp = new T[n];if (_start)//不为空,拷贝原数据{memcpy(tmp, _start, sizeof(T) * size());delete[] _start;}_start = tmp;_finish = tmp + old_size;//更新_finish_end_of_storage = tmp + n;}}void resize(size_t n, const T& value = T()){if (n <= size()){_finish = _start + n;}else{if (capacity() < n){reserve(n);}while (size() < n){push_back(value);}}}T& operator[](size_t i){assert(i < size());assert(i >= 0);return _start[i];}const T& operator[](size_t i) const{assert(i < size());assert(i >= 0);return _start[i];}void push_back(const T& x){if (capacity() == size()){size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);}_start[size()] = x;//*_finish =x;_finish++;}void pop_back(){assert(size() > 0);--_finish;}void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);}//在pos位置之前插入Xiterator insert(iterator pos, const T& x){assert(pos >= _start);//不要忘了断言assert(pos <= _finish);if (_finish == _end_of_storage)//扩容会导致迭代器失效,要去更新pos{size_t length = pos - _start;size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);pos = _start + length;}iterator it1 = _finish;while (it1 != pos)//挪动数据{*(it1) = *(it1 - 1);--it1;}*pos = x;_finish++;return pos;}iterator erase(iterator pos)//返回擦出后的下一个{assert(pos >= _start);assert(pos < _finish);size_t len = pos - _start;iterator it2 = pos;while (it2 < _finish){*(it2) = *(it2 + 1);++it2;}--_finish;if (size() > 0){return _start + len;}else{return nullptr;}}private:iterator _start = nullptr;//头iterator _finish = nullptr;//存储内容的尾iterator _end_of_storage = nullptr;//存储空间的尾部};void test1(){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);v1.push_back(9);for (auto e: v1){std::cout << e << " ";}std::cout << std::endl;std::cout << v1.size() << " " << v1.capacity()<< std::endl;v1.resize(12,666);for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;std::cout << v1.size() << " " << v1.capacity() << std::endl;v1.resize(6);for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;std::cout << v1.size() << " " << v1.capacity() << std::endl;v1.pop_back();v1.pop_back();v1.pop_back();v1.pop_back();v1.pop_back();v1.pop_back();for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;std::cout << v1.size() << " " << v1.capacity() << std::endl;/*v1.pop_back();*/for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;std::cout << v1.size() << " " << v1.capacity() << std::endl;}void test2(){vector<int> v1;for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;std::cout << v1.size() << " " << v1.capacity() << std::endl;v1.insert(v1.begin(), 10);v1.insert(v1.end(), 20);v1.insert(v1.end(), 30);v1.insert(v1.end(), 40);v1.insert(v1.end(), 50);v1.insert(v1.end(), 60);for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;std::cout << v1.size() << " " << v1.capacity() << std::endl;v1.erase(v1.end()-1);v1.erase(v1.end()-1);int* it = v1.erase(v1.begin());std::cout << *it;/*	for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;std::cout << v1.size() << " " << v1.capacity() << std::endl;*/}void test3(){vector<int> v1;v1.push_back(10);v1.push_back(20);v1.push_back(30);v1.push_back(40);for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;vector<int> v2;v2 = v1;for (auto e : v2){std::cout << e << " ";}std::cout << std::endl;}void test4(){vector<int> v1;v1.push_back(10);v1.push_back(20);v1.push_back(30);v1.push_back(40);for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;vector<int> v2(v1.begin() + 1, v1.end());for (auto e : v2){std::cout << e << " ";}std::cout << std::endl;}void test5(){int x = 0;int k = int();int j(10);std::cout << x << " " << j << " " << k << std::endl;}void test6(){std::string s1("c");vector<std::string> v1(5);//第二个参数省略,用缺省值vector<std::string>v2(5, s1);vector<std::string>v3(5, "aa");//vector<std::string>v3(5, 1);会报错,系统认为与template<class InputIterator>更匹配//vector(InputIterator first,InputIterator last)vector<int> v4((size_t)5, 1);//5u指的是unsigned_intfor (auto e : v1){std::cout << e << " ";}std::cout << std::endl;for (auto e : v2){std::cout << e << " ";}std::cout << std::endl;for (auto e : v3){std::cout << e << " ";}std::cout << std::endl;for (auto e : v4){std::cout << e << " ";}std::cout << std::endl;vector<int> v5(10, 1);for (auto e : v5){std::cout << e << " ";}std::cout << std::endl;}}

test.cpp

#include"vector.h"int main()
{bit::test6();return 0;
}

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助

欢迎各位点赞,收藏和关注哦

如果有疑问或有不同见解,欢迎在评论区留言哦

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

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

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

相关文章

【数据结构与算法】堆排序算法 详解

堆排序算法 Status heapAdjust(ElemType *a, int s, int m) {ElemType t a[s];for (int j s * 2 1; j < m; j j * 2 1) {if (j < m && a[j] < a[j 1]) {j;}if (t > a[j]) {break;}a[s] a[j];s j;}a[s] t;return OK; }Status heapSort(ElemType *a…

xhs 旋转验证码剖析和协议算法实现

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#…

计算机视觉的职业规划

Hi&#xff0c;大家好。我是茶桁。 今天这节课呢&#xff0c;咱们先不着急讲原理&#xff0c;先来讲讲职业规划的话题。 如果想要直接上手企业级的 AI 项目&#xff0c;可以看看咱们的「AI 人工智能企业项目实战」。 趋势和薪资 首先&#xff0c;先来讲讲就业的趋势。其实学…

JavaWeb——MySQL:DDL

目录 3. DQL:查询 ​编辑3.3 排序查询&#xff08;order by&#xff09; &#xff08;1&#xff09;排序 &#xff08;2&#xff09;多字段排序&#xff1a; &#xff08;3&#xff09;总结&#xff1a; 3. DQL:查询 查询是使用最多、最频繁的操作&#xff0c;因为前面的…

开心汉化轻量级工单与知识库一体化管理系统源码

开心汉化发布&#xff1a;轻量级工单与知识库一体化管理系统源码 我们很高兴地宣布&#xff0c;开心汉化团队现已发布一款轻量级工单与知识库一体化管理系统的汉化源码。该系统不仅功能强大&#xff0c;而且易于部署和管理&#xff0c;适用于各类企业或个人管理大量工单数据的…

微软结束将数据中心置于海底的实验

2016 年&#xff0c;微软 宣布了一项名为"纳蒂克项目"&#xff08;Project Natick&#xff09;的实验。基本而言&#xff0c;该项目旨在了解数据中心能否在海洋水下安装和运行。经过多次较小规模的测试运行后&#xff0c;该公司于 2018 年春季在苏格兰海岸外 117 英尺…

密码学及其应用 —— Java中的安全性

1. 简介 Java是一种广泛使用的编程语言&#xff0c;特别是在企业级解决方案中&#xff0c;比如使用J2EE、JavaBeans等技术。在Web开发领域&#xff0c;Java也有其应用&#xff0c;如客户端的applet和服务器端的Servlets/JSP。 1.1 Java的特点 面向对象&#xff1a;Java是一种面…

【个人博客搭建】(26)发布后端webapi项目

1、选择启动的webapi&#xff0c;右击发布 2、选择左下角的“显示所有设置” 在上一页按钮那边是发布文件夹的目录 地址&#xff0c; 现在界面的就是配置的信息&#xff0c; 配置&#xff1a;Debug、Release 目标框架&#xff1a;我们用的net8.0&#xff0c;就是他&#xff…

FPGA学习笔记(5)——硬件调试与使用内置的集成逻辑分析仪(ILA)IP核

如果要对信号进行分析&#xff0c;可以使用外置的逻辑分析仪&#xff0c;但成本较高&#xff0c;对初学者来说没有必要&#xff0c;可以使用Xilinx Vivado内自带的逻辑分析仪IP核对信号进行分析&#xff0c;不过需要占用一定的芯片资源。 本节采用上一节配置的LED灯闪烁代码&a…

学习记录697@数据通信基础之异步通信和同步通信

最近在看计算机网络物理层部分&#xff0c;涉及到异步通信和同步通信&#xff0c;这个和通信知识相关。 异步通信和同步通信都是为了解决时钟同步问题&#xff0c;这个和编程中的同步和异步是不一样的概念。 时钟同步 我的理解是&#xff0c;发送者发送一系列信号&#xff0…

手机定位技术全解析:原理、发展与应用

1. 引言 背景介绍 最近&#xff0c;神仙姐姐刘亦菲主演的电视剧《玫瑰的故事》中的一段情节引发了广泛讨论。剧中&#xff0c;方协文&#xff08;丈夫&#xff09;对玫瑰&#xff08;妻子&#xff09;的控制欲变本加厉&#xff0c;竟然偷偷在她的手机上安装监控软件&#xff…

python笔记3

1.通过乘法多次打印&#xff0c;以及字符串相加的合体打印 xzzz yyyy print(xy) print(x*10)#与一个数为打印多少次 2.设置俩个变量&#xff0c;可以通过下面的方法来判断是否一个元素是否在另一个元素中&#xff0c;返回bool值 xzzz yyyy print(xy) print(x*10)#与一个数为打…

Android app Java层异常捕获方案

背景&#xff1a; 在Android app运行中&#xff0c;有时一些无关紧要的异常出现时希望App 不崩溃&#xff0c;能继续让用户操作&#xff0c;可以有效提升用户体验和增加业务价值。 新流程&#xff1a; 哪些场景需要Catch Crash Config配置信息&#xff1a; 支持从网络上获…

PPT录屏怎么录?PPT录屏,3种方法简单操作

在数字化时代&#xff0c;PPT已经成为我们日常工作、学习和生活中不可或缺的一部分。无论是商务报告、教学课件还是产品展示&#xff0c;PPT都能帮助我们更加生动、直观地传递信息。然而&#xff0c;有时候我们会面临PPT录屏怎么录的问题。这时&#xff0c;一个好的PPT录屏功能…

合同与合规管理:国企数字化转型之路

在全球经济一体化的背景下&#xff0c;国有企业作为国家经济的重要支撑&#xff0c;其稳健的操作和高效的管理备受瞩目。随着市场经济条件的不断演变和法规的日益严格&#xff0c;传统的手动处理合同和合规管理方式已逐步显示出局限性。采纳先进的合同管理系统和合规管理系统从…

【C++11(二)】lambda表达式和可变参数模板

一、可变参数模板 C11的新特性可变参数模板 能够让您创建可以接受 可变参数的函数模板和类模板 // Args是一个模板参数包&#xff0c;args是一个函数形参参数包 // 声明一个参数包Args...args&#xff0c;这个参数包中可以包含0到任意个模板参数。 template <class ...Arg…

科普文:贝叶斯过滤器判定垃圾邮件

简介 贝叶斯分类的运作是借着使用标记(一般是字词&#xff0c;有时候是其他)与垃圾邮件、非垃圾邮件的关连&#xff0c;然后搭配贝叶斯推断来计算一封邮件为垃圾邮件的可能性。 贝叶斯垃圾邮件过滤是非常有威力的技术&#xff0c;可以修改自己以符合个别使用者的需要&#xff0…

C# Onnx Yolov8-OBB 旋转目标检测 行驶证副页条码+编号 检测,后续裁剪出图片并摆正显示

C# Onnx Yolov8-OBB 旋转目标检测 行驶证副页条码编号 检测&#xff0c;后续裁剪出图片并摆正显示 目录 效果 模型信息 项目 代码 下载 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-06-25T10:59:15.206586 description&#xff1a;…

React 19 新特性集合

前言&#xff1a;https://juejin.cn/post/7337207433868197915 新 React 版本信息 伴随 React v19 Beta 的发布&#xff0c;React v18.3 也一并发布。 React v18.3相比最后一个 React v18 的版本 v18.2 &#xff0c;v18.3 添加了一些警告提示&#xff0c;便于尽早发现问题&a…

利用百数应用优化制造细节,提升生产效率的技术实践

制造管理是确保企业高效、高质生产的核心环节&#xff0c;对于提高企业的运营效率、质量控制、成本控制、交货期保障、资源优化、创新能力以及风险管理等方面都具有重要意义&#xff0c;它能帮助企业在激烈的市场竞争中保持领先地位&#xff0c;同时实现资源的有效利用和风险的…