vector的模拟实现(C++)

devtools/2025/1/15 16:19:40/

一、构造函数

vector()   //构造函数:_start(nullptr),_finish(nullptr),_endofstorage(nullptr)
{}vector(int n, const T& val = T())//构造函数:_start(nullptr), _finish(nullptr), _endofstorage(nullptr)
{reserve(n);while (n--){push_back(val);}
}template<class InputIterator>
vector(InputIterator first, InputIterator last)//构造函数:_start(nullptr), _finish(nullptr), _endofstorage(nullptr)
{while (first != last){push_back(*first);first++;}
}

 二、拷贝构造

vector(const vector<T>& v)//拷贝构造:_start(nullptr),_finish(nullptr),_endofstorage(nullptr)
{reserve(v.capacity());for (auto& c : v){push_back(c);}
}

三、析构

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

四、重载

void swap(vector<T>& 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;
}
T& operator[](size_t pos)
{assert(pos < size());return *(_start + pos);
}
const T& operator[](size_t pos) const
{assert(pos < size());return *(_start + pos);
}

五、扩容及增删

size_t size() const
{return _finish - _start;
}size_t capacity() const
{return _endofstorage - _start;
}void push_back(const T& val)
{//if (_finish == _endofstorage)//{//	reserve(capacity() == 0 ? 4 : capacity() * 2);//}//*_finish = val;//_finish++;insert(end(), val);
}void reserve(size_t n)
{if (capacity() < n){size_t sz = size();T* tmp = new T[n];if (_start){for (size_t i = 0; i < sz; i++){tmp[i] = _start[i];}delete[] _start;}_start = tmp;_finish = _start + sz;_endofstorage = _start + n;}
}void resize(size_t n, const T& val = T())
{if (n <= size()){_finish = _start + n;}else{reserve(n);while (_finish != _start + n){*_finish = val;_finish++;}}
}
void pop_back()
{_finish--;
}
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;}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;end--;}*pos = x;_finish++;
}void erase(iterator pos)
{assert(pos >= _start);assert(pos < _finish);while (pos != end()){*pos = *(pos + 1);pos++;}_finish--;
}

总体:

namespace asd //设一个命名空间避免与std冲突
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;vector()   //构造函数:_start(nullptr),_finish(nullptr),_endofstorage(nullptr){}vector(int n, const T& val = T())//构造函数:_start(nullptr), _finish(nullptr), _endofstorage(nullptr){reserve(n);while (n--){push_back(val);}}template<class InputIterator>vector(InputIterator first, InputIterator last)//构造函数:_start(nullptr), _finish(nullptr), _endofstorage(nullptr){while (first != last){push_back(*first);first++;}}vector(const vector<T>& v)//拷贝构造:_start(nullptr),_finish(nullptr),_endofstorage(nullptr){reserve(v.capacity());for (auto& c : v){push_back(c);}}vector<T>& operator=(vector<T> tmp){swap(tmp);return *this;}~vector(){delete[] _start;_start = _finish = _endofstorage = nullptr;}//迭代器iterator begin(){return _start;}iterator end(){return _finish;}const_iterator cbegin() const{return _start;}const_iterator cend() const{return _finish;}size_t size() const{return _finish - _start;}size_t capacity() const{return _endofstorage - _start;}void push_back(const T& val){//if (_finish == _endofstorage)//{//	reserve(capacity() == 0 ? 4 : capacity() * 2);//}//*_finish = val;//_finish++;insert(end(), val);}void reserve(size_t n){if (capacity() < n){size_t sz = size();T* tmp = new T[n];if (_start){for (size_t i = 0; i < sz; i++){tmp[i] = _start[i];}delete[] _start;}_start = tmp;_finish = _start + sz;_endofstorage = _start + n;}}void resize(size_t n, const T& val = T()){if (n <= size()){_finish = _start + n;}else{reserve(n);while (_finish != _start + n){*_finish = val;_finish++;}}}T& operator[](size_t pos){assert(pos < size());return *(_start + pos);}const T& operator[](size_t pos) const{assert(pos < size());return *(_start + pos);}void pop_back(){_finish--;}void swap(vector<T>& v){std:: swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v._endofstorage);}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;}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;end--;}*pos = x;_finish++;}void erase(iterator pos){assert(pos >= _start);assert(pos < _finish);while (pos != end()){*pos = *(pos + 1);pos++;}_finish--;}private:iterator _start;iterator _finish;iterator _endofstorage;};
}


http://www.ppmy.cn/devtools/150721.html

相关文章

LeetCode2799 统计完全子数组的数目

计算完全子数组的数目&#xff1a;从暴力到优化的算法实现 在算法的世界里&#xff0c;常常会遇到各种有趣的数组问题&#xff0c;今天我们要探讨的是计算完全子数组的数目。这个问题来自LeetCode&#xff0c;题目如下&#xff1a; 给你一个由正整数组成的数组 nums。如果数组…

matlab实现了一个优化的遗传算法,用于求解注汽站最优位置的问题

function [best_chromosome, best_fitness] optimized_genetic_algorithm()%% 遗传算法参数初始化% 定义井信息&#xff0c;包括坐标、管道长度、流量、压力等wells defineWells(); % 返回井的结构体数组N length(wells); % 注汽井数量% 遗传算法相关参数L_chromosome 20; …

FPGA车牌识别

基于FPGA的车牌识别主要包含以下几个步骤&#xff1a;图像采集、颜色空间转换、边缘检测、形态学处理&#xff08;腐蚀和膨胀&#xff09;、特征值提取、模板匹配、结果显示。先用matlab对原理进行仿真&#xff0c;后用vivado和modelsim进行设计和仿真。 一、1.图像采集采用ov…

STM32第6章、WWDG

一、简介 WWDG&#xff1a;全称Window watchdog&#xff0c;即窗口看门狗&#xff0c;本质上是一个能产生系统复位信号和提前唤醒中断的计数器。 特性&#xff1a; 是一个递减计数器。 看门狗被激活后&#xff0c; 当递减计数器值从 0x40减到0x3F时会产生复位&#xff08;即T6位…

朴素贝叶斯分类器

一、生成模型&#xff08;学习&#xff09;&#xff08;Generative Model&#xff09; vs 判别模型&#xff08;学习&#xff09;&#xff08;Discriminative Model&#xff09; 结论&#xff1a;贝叶斯分类器是生成模型 1、官方说明 生成模型对联合概率 p(x, y)建模&#x…

Python----Python爬虫(Scrapy的应用:CrawlSpider 使用,爬取小说,CrawlSpider版)

一、CrawlSpider 使用 1.1、CrawlSpider CrawSpiders 是 Scrapy 框架中的一个特殊爬虫类&#xff0c;它用于处理需要跟随链接并抓取多个页面的情况。相比于基本的 Spider 类&#xff0c;CrawSpiders 提供了一个更灵活、更强大的方式来定义爬取规则。 在Scrapy中Spider是所有爬…

Redis十大数据类型详解

Redis&#xff08;一&#xff09; 十大数据类型 redis字符串&#xff08;String&#xff09; string是redis最基本的类型&#xff0c;一个key对应一个value string类型是二进制安全的&#xff0c;意思是redis的string可以包含任何数据。例如说是jpg图片或者序列化对象 一个re…

XML通过HTTP POST 请求发送到指定的 API 地址,进行数据回传

代码结构说明 这段代码的主要功能是&#xff1a; 从指定文件夹中读取所有 XML 文件。 将每个 XML 文件的内容通过 HTTP POST 请求发送到指定的 API 地址。 处理服务器的响应&#xff0c;并记录每个文件的处理结果。 using System; using System.IO; using System.Net; usin…