【C++】vector的模拟实现

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


1、vector的模拟实现.h

#pragma oncenamespace My_vector
{template<class T>class vector{public:typedef T* iterator; //typedef受访问限定符限制,要放成公有typedef const T* const_iterator;iterator begin(){return _start;}iterator end(){return _finish; //end和_finish都指向最后一个数的下一个}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}size_t capacity() const{return _endofstorage - _start;}size_t size() const{return _finish - _start;}//无参构造vector():_start(nullptr), _finish(nullptr), _endofstorage(nullptr){}//n个val值构造vector(size_t n, const T val = T()){reserve(n);for (size_t i = 0; i < n; i++){push_back(val);}}vector(int n, const T val = T()){reserve(n);for (int i = 0; i < n; i++){push_back(val);}}//拷贝构造vector(const vector<T>& v):_start(nullptr),_finish(nullptr),_endofstorage(nullptr){reserve(v.capacity());for (auto& e : v){push_back(e);}}//v3 = v1void swap(vector<int>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v._endofstorage);}vector<T>& operator=(vector<T> tmp) //传参用了拷贝构造{swap(tmp);return *this;}//迭代区间构造//类模板里可以套函数模板template<class InputIterator>vector(InputIterator first, InputIterator last):_start(nullptr), _finish(nullptr), _endofstorage(nullptr){while (first != last){push_back(*first);++first;}}~vector(){delete[] _start;_start = _finish = _endofstorage = nullptr;}void reserve(size_t n){size_t sz = size();if (n > capacity()){T* tmp = new T[n];if (_start){//memcpy(tmp, _start, sizeof(T) * sz);for (size_t i = 0; i < sz; i++){tmp[i] = _start[i];}delete[] _start;}_start = tmp;_finish = _start + sz;_endofstorage = _start + n;}}//void rsize(size_t n, T val = T())void rsize(size_t n, const T& val = T()) //匿名对象具有常性,要加const{if (n > size()){reserve(n);while (_finish < _start + n){*_finish = val;++_finish;}}if (n <= size()){_finish = _start + n;}}void push_back(const T& x){if (_finish == _endofstorage){/*size_t sz = size();size_t cp = capacity() == 0 ? 4 : capacity() * 2;T* tmp = new T[cp];if (_start){memcpy(tmp, _start, sizeof(T) * sz);delete[] _start;}_start = tmp;_finish = _start + sz;_endofstorage = _start + cp;*/reserve(capacity() == 0 ? 4 : capacity() * 2);}*_finish = x;++_finish;}//insert、erase操作后迭代器都会失效,不能再访问void insert(iterator pos, const T& x){assert(pos >= _start);assert(pos <= _finish);if (_finish == _endofstorage){size_t len = pos - _start;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _start + len; //扩容后要更新pos的相对位置}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;--end;}*pos = x;++_finish;}iterator erase(iterator pos){assert(pos >= _start);assert(pos < _finish);iterator it = pos + 1;while (it < _finish){*(it - 1) = *it;it++;}--_finish;return pos;}T& operator[](size_t pos){assert(pos < size());return _start[pos];}const T& operator[](size_t pos) const{assert(pos < size());return _start[pos];}private:iterator _start;iterator _finish;iterator _endofstorage;};void Test1(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.push_back(6);for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;vector<int>::iterator it = v.begin();while (it != v.end()){*it *= 10;cout << *it << ' ';it++;}cout << endl;for (auto e : v){cout << e << " ";}cout << endl;}void Test2(){vector<int*> v1;v1.rsize(5);vector<string> v2;//v2.rsize(5, string("xxx")); //匿名对象v2.rsize(5, "xxx"); //隐式类型转换for (auto e : v1){cout << e << ' ';}cout << endl;for (auto e : v2){cout << e << ' ';}cout << endl;}void Test3(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.push_back(6);for (auto e : v){cout << e << ' ';}cout << endl;v.insert(v.begin() + 2, 30);v.insert(v.begin(), 0);for (auto e : v){cout << e << ' ';}cout << endl;v.erase(v.begin());v.erase(v.begin() + 2);for (auto e : v){cout << e << ' ';}cout << endl;}void Test4(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.push_back(6);v.push_back(6);v.push_back(7);v.push_back(8);auto it = v.begin();while (it != v.end()){if (*it % 2 == 0){it = v.erase(it);//it = it - 1;}else{it++; //不删除再++}}for (auto e : v){cout << e << ' ';}cout << endl;}void Test5(){vector<string> v;v.push_back("111111111111111111111");v.push_back("111111111111111111111");v.push_back("111111111111111111111");v.push_back("111111111111111111111");v.push_back("111111111111111111111");for (auto e : v){cout << e << " ";}cout << endl;}void Test6(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){cout << e << " ";}cout << endl;vector<int> v2(v);for (auto e : v2){cout << e << " ";}cout << endl;vector<int> v3;v3.push_back(3);v3.push_back(4);v3.push_back(5);v3.push_back(6);v3.push_back(7);v2 = v3;for (auto e : v2){cout << e << " ";}cout << endl;}void Test7(){vector<int> v1(10, 15);vector<int> v2(v1.begin(), v1.end());for (auto e : v2){cout << e << " ";}cout << endl;vector<string> v3(5, "xxx");vector<string> v4(v3.begin(), v3.end());for (auto e : v4){cout << e << " ";}cout << endl;}
}

2、Test.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <assert.h>
#include <string.h>
#include <vector>
using namespace std;#include "1、vector的模拟实现.h"int main()
{My_vector::Test7();return 0;
}

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

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

相关文章

SQL-DQL

-----分组查询----- 1.语法&#xff1a; SELECT 字段列表 FROM 表名 [WHERE 条件 ] GROUP BY 分组字段名 [HAVING 分组后过滤条件]&#xff1b; 2.where与having区别 》执行时机不同&#xff1a;where是分组之前进行过滤&#xff0c;不满足where条件&#xff0c;不参与分组&…

启迪未来:学乐多光屏P90引领儿童智能学习革命

在当今数字化时代&#xff0c;教育方式正经历着巨大的变革&#xff0c;智能硬件为教育领域带来了前所未有的机遇和挑战。学乐多光屏学习机作为一款创新的教育智能硬件产品&#xff0c;以其独特的特点和优势&#xff0c;引领着学习机领域的发展潮流。 1. 多功能融合&#xff1a;…

异或^实现数据加密

异或是一种二进制的位运算&#xff0c;符号以 XOR 或 ^ 表示。 1.1运算规则 相同为0&#xff0c;不同为1&#xff0c;即 1 ^ 1 0 0 ^ 0 0 1 ^ 0 1 由运算规则可知&#xff0c;任何二进制数与零异或&#xff0c;都会等于其本身&#xff0c;即 A ^ 0 A。 1.2 异或性质 …

自动化管理管理工具----Ansible

目录 ​编辑 一、Ansible概念 1.1特点 二、工作机制&#xff08;日常模块&#xff09; 2.1 核心程序 三、Ansible 环境安装部署 四、ansible 命令行模块 4.1command 模块 4.2shell 模块 4.3cron 模块 4.4user 模块 4.5group 模块 4.6copy模块 4.7file模块 4.8ho…

静态路由配置实验(超详细讲解+详细命令行)

系列文章目录 华为数通学习&#xff08;7&#xff09; 前言 一&#xff0c;静态路由配置 二&#xff0c;网络地址配置 AR1的配置&#xff1a; AR2的配置&#xff1a; AR3的配置&#xff1a; 三&#xff0c;测试是否连通 AR1的配置: 讲解&#xff1a; AR2的配置&#…

Postman的高级用法—Runner的使用​

1.首先在postman新建要批量运行的接口文件夹&#xff0c;新建一个接口&#xff0c;并设置好全局变量。 2.然后在Test里面设置好要断言的方法 如&#xff1a; tests["Status code is 200"] responseCode.code 200; tests["Response time is less than 10000…

自研的外贸搜索工具

全球智能搜索 独有的VVPN技术有效绕过各种限制获取国外搜索引擎数据 1.支持全球所有国家搜索引擎&#xff0c;及社交平台&#xff0c;精准定位优质的外贸客户. 2.全球任意国家地区实时采集. 3.搜索引擎全网邮箱电话采集 4.社交平台一键查看采集&#xff08;Facebook,Twitter,L…

CTFhub-文件上传-MIME绕过

Content-Type类型有&#xff1a;HTTP content-type | 菜鸟教程 用哥斯拉生成 php 木马文件 1.php 抓包---> 修改 conten-type 类型 为 imge/jpeg 用蚁剑连接 ctfhub{8e6af8109ca15932bad4747a}

git 提交错误,回滚到某一个版本

git log 查看版本号 commit 后面跟的就是版本号git reset --hard 版本号 &#xff08;就可以回滚到你要去的版本&#xff09;git push -f &#xff08;因为本地回滚了&#xff0c;所以和远程会差几个版本。所以这时候只有强制推送&#xff0c;覆盖远程才可以&#xff09;

LeetCode-56-合并区间

题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 可以使用 LinkedList&#xff0c;…

服务器数据恢复-vmware ESXI虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 从物理机迁移一台虚拟机到ESXI&#xff0c;迁移后做了一个快照。该虚拟机上部署了一个SQLServer数据库&#xff0c;存放了5年左右的数据。ESXI上有数十台虚拟机&#xff0c;EXSI连接了一台EVA存储&#xff0c;所有的虚拟机都在EVA存储上。 服务…

ios ipa包上传需要什么工具

目录 ios ipa包上传需要什么工具 前言 一、IPA包的原理 二、IPA包上传的步骤 1.注册开发者账号 2.apk软件制作工具创建应用程序 3.构建应用程序 4.生成证书和配置文件 5.打包IPA包 6.上传IPA包 三、总结 前言 iOS IPA包是iOS应用程序的安装包&#xff0c;可以通过iT…