实现C++ Vector

手写C++ Vector,参考QVector

类声明

	template<typename T >class IteratorVector;template<typename T >class IteratorVectorConst;template<typename T >class Vector final :public ContainerBase{public:explicit Vector()noexcept;explicit Vector(uint size)noexcept;Vector(const Vector& t)noexcept;Vector(Vector&& t)noexcept;Vector& operator= (const Vector& t)noexcept;Vector& operator= (Vector&& t)noexcept;~Vector();Vector& append(const T& t)noexcept;Vector& removeAt(uint pos)noexcept;Vector& removeAt(uint pos, uint len)noexcept;Vector& insert(uint pos, const T& t)noexcept;const T& at(uint pos)const;void clear()noexcept;Vector& removeOne(const T& t, uint pos = 0, bool onlyOne = true)noexcept;uint size()const noexcept { return m_size; };uint maxSize()const noexcept { return m_maxSize; };void setStep(uint step)noexcept { m_step = step; };uint step()const noexcept { return m_step; };bool isEmpty()const noexcept { return m_size; };void resize(uint size)noexcept;void resize(uint size, const T& t)noexcept;void swap(uint first, uint second)noexcept;void removeFirst()noexcept;void removeLast()noexcept;const T& first()const;const T& last()const;T& first();T& last();bool contains(const T& t, uint pos = 0)const noexcept;size_t find(const T& t, uint pos = 0) const noexcept;template<typename Funtion>size_t find(const T& t, const Funtion& f, uint pos = 0) const noexcept;uint capacity() const noexcept { return m_capacity; };void reverse()noexcept;T& operator[](uint pos)noexcept;IteratorVector<T> begin()noexcept;IteratorVector<T> end()noexcept;IteratorVectorConst<T> begin()const noexcept;IteratorVectorConst<T> end()const noexcept;private:T* m_element;uint m_size;uint m_step;uint m_capacity;static constexpr uint m_stepUint = 10;static constexpr size_t m_npos = -1;void _throw(bool v)const{if (v)throw std::out_of_range("Vector request out of range");}void freeMemory()noexcept{if (m_element != nullptr){delete[] m_element;m_element = nullptr;}}};#define OverstepMaxAssert assert(m_capacity <= m_maxSize);
#define ElementSize sizeof(T) * m_size

函数实现

template<typename T >MContainer::Vector<T>::Vector() noexcept:Vector(0){}template<typename T >MContainer::Vector<T>::Vector(uint size) noexcept:m_size(0), m_step(m_stepUint), m_capacity(size){OverstepMaxAssertm_element = new T[m_capacity];}template<typename T >MContainer::Vector<T>::Vector(const Vector& t) noexcept{if (&t == this)return;this->m_element = new T[t.m_capacity];this->m_size = t.m_size;this->m_step = t.m_step;this->m_capacity = t.m_capacity;std::memcpy(this->m_element, t.m_element, ElementSize);}template<typename T >MContainer::Vector<T>::Vector(Vector&& t) noexcept{if (&t == this)return;this->m_element = t.m_element;this->m_size = t.m_size;this->m_step = t.m_step;this->m_capacity = t.m_capacity;t.m_element = nullptr;t.m_size = 0;t.m_capacity = 0;}template<typename T>inline Vector<T>& Vector<T>::operator=(const Vector& t) noexcept{if (&t == this)return *this;this->m_element = new T[t.m_capacity];this->m_size = t.m_size;this->m_step = t.m_step;this->m_capacity = t.m_capacity;std::memcpy(this->m_element, t.m_element, ElementSize);return *this;}template<typename T>inline Vector<T>& Vector<T>::operator=(Vector&& t) noexcept{if (&t == this)return *this;this->clear();this->m_element = t.m_element;this->m_size = t.m_size;this->m_step = t.m_step;this->m_capacity = t.m_capacity;t.m_element = nullptr;t.m_size = 0;t.m_capacity = 0;return *this;}template<typename T>inline Vector<T>::~Vector(){clear();}template<typename T>inline Vector<T>& Vector<T>::append(const T& t) noexcept{if (m_size + 1 > m_capacity){assert(m_capacity + 1 <= m_maxSize);m_capacity = m_capacity + m_step > m_maxSize ? m_maxSize : m_capacity + m_step;T* newArray = new T[m_capacity];std::memcpy(newArray, m_element, ElementSize);freeMemory();m_element = newArray;}m_element[m_size++] = t;return *this;}template<typename T >Vector<T>& MContainer::Vector<T>::removeAt(uint pos, uint len) noexcept{if (pos < 0 || pos > m_size)return *this;if (len + pos > m_size)len = m_size - pos;uint range = pos + len;uint size = m_size - range;std::memmove(m_element + pos, m_element + range, sizeof(T) * size);m_size -= len;return *this;}template<typename T>inline Vector<T>& Vector<T>::removeAt(uint pos) noexcept{return removeAt(pos, 1);}template<typename T>inline Vector<T>& Vector<T>::insert(uint pos, const T& t)noexcept{uint size = m_size + 1;if (pos > size)return *this;if (size > m_capacity){assert(m_capacity + 1 <= m_maxSize);m_capacity = m_capacity + m_step > m_maxSize ? m_maxSize : m_capacity + m_step;T* newArray = new T[m_capacity];std::memcpy(newArray, m_element, ElementSize);freeMemory();m_element = newArray;}uint count = m_size - pos;uint movePos = m_size;while (count){m_element[movePos] = m_element[movePos - 1];movePos -= 1;count--;}m_element[pos] = t;m_size++;return *this;}template<typename T>inline const T& Vector<T>::at(uint pos) const{_throw(pos >= m_size);return m_element[pos];}template<typename T>inline void Vector<T>::clear()noexcept{freeMemory();m_size = 0;m_capacity = 0;m_step = m_stepUint;}template<typename T>inline Vector<T>& Vector<T>::removeOne(const T& t, uint pos, bool onlyOne)noexcept{if (pos >= m_size)return *this;for (size_t i = 0; i < m_size; i++){if (m_element[i] == t){removeAt(i);if (onlyOne)return *this;}}return *this;}template<typename T>inline T& Vector<T>::operator[](uint pos) noexcept{_throw(pos >= m_size);return m_element[pos];}template<typename T >T& MContainer::Vector<T>::last(){_throw(!m_size);return m_element[m_size - 1];}template<typename T >T& MContainer::Vector<T>::first(){_throw(!m_size);return m_element[0];}template<typename T >bool MContainer::Vector<T>::contains(const T& t, uint pos /*= 0*/)const noexcept{for (; pos < m_size; pos++){if (t == m_element[pos])return true;}return false;}template<typename T >const T& MContainer::Vector<T>::last()const{_throw(!m_size);return m_element[m_size - 1];}template<typename T >const T& MContainer::Vector<T>::first()const{_throw(!m_size);return m_element[0];}template<typename T >void MContainer::Vector<T>::removeLast()noexcept{removeAt(m_size - 1);}template<typename T >void MContainer::Vector<T>::removeFirst()noexcept{removeAt(0);}template<typename T >void MContainer::Vector<T>::swap(uint first, uint second)noexcept{if (first == second|| first >= m_size|| second >= m_size)return;T tmp = m_element[first];m_element[first] = m_element[second];m_element[second] = tmp;}template<typename T >void MContainer::Vector<T>::resize(uint size, const T& t)noexcept{clear();m_capacity = size;m_size = size;m_element = new T[m_capacity]{ t };}template<typename T >void MContainer::Vector<T>::resize(uint size)noexcept{resize(size, {});}template<typename T >size_t MContainer::Vector<T>::find(const T& t, uint pos)const noexcept{for (; pos < m_size; pos++){if (m_element[pos] == t)return pos;}return m_nopos;}template<typename T >template<typename Funtion>size_t MContainer::Vector<T>::find(const T& t, const Funtion& f, uint pos /*= 0*/)const noexcept{for (; pos < m_size; pos++){if (f(this->at(pos), t))return pos;}return m_nopos;}template<typename T >void MContainer::Vector<T>::reverse() noexcept{if (isEmpty())return;T tmp;for (size_t i = 0; i < m_size / 2; i++){tmp = m_element[i];m_element[i] = m_element[m_size - 1 - i];m_element[m_size - 1 - i] = tmp;}}template<typename T >IteratorVectorConst<T> MContainer::Vector<T>::end() const noexcept{return IteratorVectorConst<T>(m_element + m_size);}template<typename T >IteratorVectorConst<T> MContainer::Vector<T>::begin() const noexcept{return IteratorVectorConst<T>(m_element);}template<typename T >IteratorVector<T> MContainer::Vector<T>::end()noexcept{return IteratorVector<T>(m_element + m_size);}template<typename T >IteratorVector<T> MContainer::Vector<T>::begin()noexcept{return IteratorVector<T>(m_element);}

迭代器

template<typename T >class IteratorVector :public  std::iterator<std::random_access_iterator_tag, T>{private:friend  Vector<T>;T* m_ptr;IteratorVector<T>(T* t):m_ptr(t){}public:IteratorVector<T> operator++(){return ++m_ptr;}IteratorVector<T> operator++(int){T * tmp = m_ptr;m_ptr++;return tmp;}IteratorVector<T> operator--(){return --m_ptr;}IteratorVector<T> operator--(int){T * tmp = m_ptr;m_ptr--;return tmp;}T*operator->(){return m_ptr;}T& operator*(){return* m_ptr;}bool operator!=(const IteratorVector<T>& t)const{return m_ptr != t.m_ptr;}bool operator==(const IteratorVector<T>& t)const{return m_ptr == t.m_ptr;}bool operator<(const IteratorVector<T>& t)const{return m_ptr < t.m_ptr;}bool operator>(const IteratorVector<T>& t)const{return m_ptr > t.m_ptr;}IteratorVector<T> operator+=(difference_type size)const{T* tmp = m_ptr + size;return tmp;}IteratorVector<T> operator-=(difference_type size)const{T* tmp = m_ptr - size;return tmp;}};template<typename T >class IteratorVectorConst :public  std::iterator<std::random_access_iterator_tag, T>{private:friend  Vector<T>;T* m_ptr;IteratorVectorConst<T>(T* t): m_ptr(t){}public:IteratorVectorConst<T> operator++(){return ++m_ptr;}IteratorVectorConst<T> operator++(int){T * tmp = m_ptr;m_ptr++;return tmp;}IteratorVectorConst<T> operator--(){-return -m_ptr;}IteratorVectorConst<T> operator--(int){T * tmp = m_ptr;m_ptr--;return tmp;}const T *operator->(){return m_ptr;}const T& operator*(){return*m_ptr;}bool operator!=(const IteratorVectorConst<T>& t)const{return m_ptr != t.m_ptr;}bool operator==(const IteratorVectorConst<T>& t)const{return m_ptr == t.m_ptr;}bool operator<(const IteratorVectorConst<T>& t)const{return m_ptr < t.m_ptr;}bool operator>(const IteratorVectorConst<T>& t)const{return m_ptr > t.m_ptr;}IteratorVectorConst<T> operator+=(difference_type size)const{T* tmp = m_ptr + size;return tmp;}IteratorVectorConst<T> operator-=(difference_type size)const{T* tmp = m_ptr - size;return tmp;}};

验证 (与QVector对比)

template <typename T1, typename T2 >
void verify(T1& t1, T2& t2 /*标准容器*/)
{auto start = std::chrono::high_resolution_clock::now();std::mt19937 rng(std::random_device{}());std::uniform_int_distribution<int> dist(0, 0xFFFFF);int size = dist(rng);for (size_t i = 0; i < size; i++){int number = dist(rng);if (number % 3 == 0){t1.append(number);t2.append(number);}else if (number % 3 == 1&& number < t2.size()){t1.insert(number, number);t2.insert(number, number);}else{if (number < t2.size()){t1.removeAt(number);t2.removeAt(number);}}}if (t1.size() != t2.size()){std::cout << "size != " << '\n';return;}auto t1Itor = t1.begin();auto t2Itor = t2.begin();for (;t1Itor != t1.end() ; t1Itor++,t2Itor++){if (*t1Itor != *t2Itor){std::cout << "Value != ; "<< '\n';}}std::cout << "Verification complete!" << '\n';auto end = std::chrono::high_resolution_clock::now();std::chrono::duration<double> elapsed = end - start;std::cout << "Verification time: " << elapsed.count()  << std::endl;
}

测试结果

测试结果图

为学习数据结构编写,容器可能存在问题。有建议可以留言指出,谢谢。

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

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

相关文章

【SpringBoot】-- 监听容器事件、Bean的前后置事件

目录 一、ApplicationContextInitializer 使用 1、自定义类&#xff0c;实现ApplicationContextInitializer接口 2、在META-INF/spring.factories配置文件中配置自定义类 二、ApplicationListener 使用 1、自定义类&#xff0c;实现ApplicationListener接口 2、在META-…

Selenium 自动化 —— 常用的定位器(Locator)

什么是定位器 定位器&#xff08;Locator&#xff09;是识别DOM中一个或多个特定元素的方法。 也可以叫选择器 Selenium 通过By类&#xff0c;提供了常见的定位器。具体语法如下&#xff1a; By.xxx("");我们选择单个元素时可以使用findByElement&#xff1a; Web…

三.Django--ORM(操作数据库)

目录 1 什么是ORM 1.1 ORM优势 1.2ORM 劣势 1.3 ORM与数据库的关系 2 ORM 2.1 作用 2.2 连接数据库 2.3 表操作--设置字段 2.4 数据库的迁移 写路由增删改查操作 项目里的urls.py: app里的views.py: 注意点: 1 什么是ORM ORM中文---对象-关系映射 在MTV,MVC设计…

Android 的 Timer 和 TimerTask

Timer 简介(来自Gemini) Timer 是 Java 中用于创建定时任务的类。它位于 java.util 包中。可以使用 Timer 来安排一次性或定期执行的任务。 每个 Timer 对象都对应一个后台线程。此线程负责从任务队列中检索任务并按计划执行它们。 使用 Timer 要使用 Timer&#xff0c;首先…

政安晨:【Keras机器学习示例演绎】(三十九)—— 使用 FNet 进行文本分类

目录 简介 模型 设置 加载数据集 对数据进行标记 格式化数据集 建立模型 训练我们的模型 与变换器模型比较 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&…

IAM帮你破解密码管理难题

面对让人头疼的密码管理难题&#xff0c;全球的政府、企业、安全厂商都在想办法。比如通过定期改密、强制添加特殊字符等方式提升密码强度&#xff0c;比如开展网络安全教育、提升员工对密码的重视程度&#xff0c;并且取得了显著效果。但是&#xff0c;想从根本上解决密码管理…

第二证券|炒股是波段好还是长期好?

炒股长时间比波段好一些&#xff0c;其原因如下&#xff1a; 1、长时间持有费用低 投资者在生意过程中&#xff0c;需求交纳必定的佣金费用、过户费用、印花税&#xff0c;而长时间持有股票&#xff0c;减少生意次数&#xff0c;能够节省一笔生意成本。 2、短期持有容易卖飞…

3.ERC4626

ERC4626是一个vault&#xff0c;在DAI中&#xff0c;使用ETH换取DAI。其流程为先充值ETH到maker vault。 Vault 资产的管理、分红用户充值某项资产获取某个凭证该凭证作为分红、推出的依据Yield Farming/借贷/质押等 以太坊改进提案EIP:ethereum improvemwnt proposal 最初E…

7.基于麻雀搜索算法(SSA)优化VMD参数(SSA-VMD)

01.智能优化算法优化VMD参数的使用说明 02.基本原理 麻雀搜索算法&#xff08;SSA&#xff09;是一种基于鸟类觅食行为的启发式优化算法&#xff0c;它模拟了麻雀在觅食时的群体行为&#xff0c;通过模拟麻雀的觅食过程来寻找问题的最优解。SSA的基本原理是通过模拟麻雀的搜索…

视频监控平台:交通运输标准JTT808设备SDK接入源代码函数分享

目录 一、JT/T 808标准简介 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;协议特点 1、通信方式 2、鉴权机制 3、消息分类 &#xff08;三&#xff09;协议主要内容 1、位置信息 2、报警信息 3、车辆控制 4、数据转发 二、代码和解释 &#xff08;一…

《ESP8266通信指南》13-Lua 简单入门(打印数据)

往期 《ESP8266通信指南》12-Lua 固件烧录-CSDN博客 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP82…

AJAX知识点(前后端交互技术)

原生AJAX AJAX全称为Asynchronous JavaScript And XML,就是异步的JS和XML&#xff0c;通过AJAX可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无需刷新就可获取数据。 AJAX不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方式 …

C语言【文件操作 2】

文章目录 前言顺序读写函数的介绍fputc && fgetcfputcfgetc fputs && fgetsfputsfgets fprintf && fscanffprintffscanf fwrite && freadfwritefread 文件的随机读写fseek函数偏移量ftell函数rewind函数 文件的结束判断被错误使用的feof 结语 …

Linux与windows网络管理

文章目录 一、TCP/IP1.1、TCP/IP概念TCP/IP是什么TCP/IP的作用TCP/IP的特点TCP/IP的工作原理 1.2、TCP/IP网络发展史1.3、OSI网络模型1.4、TCP/IP网络模型1.5、linux中配置网络网络配置文件位置DNS配置文件主机名配置文件常用网络查看命令 1.6、windows中配置网络CMD中网络常用…

认识卷积神经网络

我们现在开始了解卷积神经网络&#xff0c;卷积神经网络是深度学习在计算机视觉领域的突破性成果&#xff0c;在计算机视觉领域&#xff0c;往往我们输入的图像都很大&#xff0c;使用全连接网络的话&#xff0c;计算的代价较高&#xff0c;图像也很难保留原有的特征&#xff0…

python 和 MATLAB 都能绘制的母亲节花束!!

hey 母亲节快到了&#xff0c;教大家用python和MATLAB两种语言绘制花束~这段代码是我七夕节发的&#xff0c;我对代码进行了简化&#xff0c;同时自己整了个python版本 MATLAB 版本代码 function roseBouquet_M() % author : slandarer% 生成花朵数据 [xr,tr]meshgrid((0:24).…

jQuery-1.语法、选择器、节点操作

jQuery jQueryJavaScriptQuery&#xff0c;是一个JavaScript函数库&#xff0c;为编写JavaScript提供了更高效便捷的接口。 jQuery安装 去官网下载jQuery&#xff0c;1.x版本练习就够用 jQuery引用 <script src"lib/jquery-1.11.2.min.js"></script>…

我的Transformer专栏来啦

五一节前吹的牛&#xff0c;五一期间没完成&#xff0c;今天忙里偷闲&#xff0c;给完成了。 那就是初步拟定了一个《Transformer最后一公里》的写作大纲。 之前一直想写一系列Transformer架构的算法解析文章&#xff0c;但因为一直在忙&#xff08;虽然不知道在忙啥&#xf…

倍思|西圣开放式耳机哪个好用?热门机型深度测评!

在数字化生活的浪潮中&#xff0c;耳机已成为我们不可或缺的伴侣。然而&#xff0c;长时间佩戴传统的耳机容易导致的耳道疼痛等问题&#xff0c;严重的话将影响听力。许多人开始寻找更为舒适的佩戴体验。开放式耳机因为不需要需直接插入耳道的设计&#xff0c;逐渐受到大众的青…