模拟实现简单vector

devtools/2024/9/20 4:03:56/ 标签: 算法, c++, 开发语言

vector作为STL成员之一,在实际中也使用广泛。所有了解实现一个简单的vector也有助于我们更好的认识vector及其底层实现。

#pragma once
#include<iostream>
#include<assert.h>
using namespace std;namespace cls
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;vector() = default;vector(const vector<T>& v){reserve(v.size());for (auto& e : v){push_back(e);}}vector(int n, const T& x = T()){reserve(n);while (n--){push_back(x);}}template<class InputIterator>vector(InputIterator first,InputIterator last){while (first != last){push_back(*first);++first;}}const iterator begin() const{return _start;}const iterator end() const{return _finish;}iterator begin(){return _start;}iterator end(){return _finish;}size_t size() const{return _finish - _start;}size_t capacity()  const{return _end_of_storage - _start;}bool empty(){return _start == _finish;}vector<T>& operator=(vector<T> v){swap(v);return *this;}void reserve(size_t n){if (_start + n > _end_of_storage){size_t oldsize = size();T* temp = new T[n];size_t i = 0;for (i = 0; i < oldsize; ++i){temp[i] = _start[i];}delete[] _start;_start = temp;_finish = _start + oldsize;_end_of_storage = _start + n;}}void push_back(const T& x){if (_finish == _end_of_storage){reserve(size() == 0 ? 4 : 2 * capacity());}*_finish = x;++_finish;}void pop_back(){assert(!empty());--_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 clear(){_finish = _start;}~vector(){delete[] _start;_start = _finish = _end_of_storage = nullptr;}void swap(vector<T>& x){std::swap(_start,x._start);std::swap(_finish,x._finish);std::swap(_end_of_storage,x._end_of_storage);}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;}}}iterator insert(iterator pos , const T& x){assert(pos >= _start);assert(pos <= _finish);if (_finish == _end_of_storage){size_t len = pos - _start;reserve(2*capacity());pos = _start + len;}iterator end = _finish;while (end > pos){*(end) = *(end - 1);--end;}*pos = x;++_finish;return pos;}void erase(iterator pos){assert(pos >= _start);assert(pos < _finish);iterator begin = pos;while (begin < _finish - 1){*begin = *(begin + 1);++begin;}--_finish;}private:iterator _start = nullptr;iterator _finish = nullptr;iterator _end_of_storage = nullptr;};template<class T>void PrintVector(const vector<T>& x){typename vector<T>::const_iterator it = x.begin();while (it != x.end()){cout << *it << ' ';++it;}cout << endl;}template<class T>void PrintContainer(const T& x){for (auto e : x){cout << e << ' ';}cout << endl;}void Test(){/*vector<int> v;cout << v.size() << endl;*/vector<int> v;v.push_back(1);v.push_back(3);v.push_back(5);v.push_back(10);v.push_back(10);vector<int> v1 = v;v1.push_back(100);v = v1;v1.erase(v1.begin());v1.insert(v1.begin(),5);v1[0] = 200;v1.pop_back();v1.resize(12);vector<int> v2(5,10);PrintVector(v);PrintContainer(v1);PrintContainer(v2);}}

这里注意不能把模版实现在两个不同的文件,这样会报链接错误,实现在同一个文件就行了。希望对大家有所帮助。


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

相关文章

ArcGIS Pro基础:状态栏显示栏的比例尺设置和经纬度位置

上图所示&#xff0c;界面下方最左侧是显示的比例尺&#xff0c;可以进行选择设置&#xff0c;也可以进行自定义设置 上图所示&#xff0c;可以手动录入比例尺&#xff0c;同时也可以对比例尺设置别名&#xff0c;比如【实验1】作为特定比例尺的标记 如上图所示&#xff0c;可以…

C语言实现排序之插入排序算法

一、插入排序算法 基本思想 插入排序的基本思想是将未排序的元素逐个插入到已排序的序列中。初始时&#xff0c;假设序列的第一个元素已经被排序。然后从第二个元素开始&#xff0c;将其插入到已排序的序列中的适当位置&#xff0c;使得已排序的序列仍然有序。 步骤 初始化&…

使用 Vue 2 搭建后台管理系统

随着前端技术的不断发展&#xff0c;Vue.js 已经成为了构建复杂单页应用的一个非常流行的选择。Vue 2 提供了一个简单但强大的框架&#xff0c;用于构建用户界面。本文将指导您如何利用 Vue 2 和相关技术栈来搭建一个后台管理系统。 vue2后台管理项目实例合集下载地址见最下方…

go语言设置定时任务

在 Go 语言中&#xff0c;可以使用 time 包来设置一个定时任务。下面是一个简单的示例&#xff0c;展示了如何在每天早上 9 点输出一条消息。 实现步骤 计算下一个执行时间&#xff1a;首先&#xff0c;计算当前时间与下一个目标时间&#xff08;比如每天的 9 点&#xff09;之…

高速信号的眼图、加重、均衡

目录 高速信号的眼图、加重、均衡眼图加重均衡线性均衡器CTLE判决反馈均衡器DFE 高速信号的眼图、加重、均衡 眼图 通常用示波器观察接收信号波形的眼图来分析码间串扰和噪声对系统性能的影响&#xff0c;从而估计系统优劣程度&#xff0c;因而眼图分析是高速互连系统信号完整…

docker、防火墙关闭仍然无法访问、防火墙命令

在用docker时&#xff0c;说要提前将防火墙关闭&#xff0c;因为要用到很多端口。但是我发现我把防火墙关闭后&#xff0c;我要访问端口依然失败。。。。 于是我把防火墙打开&#xff0c;要用到什么端口就放开这个端口就好了&#xff0c;但是放开端口后&#xff0c;要restart …

[Day 54] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

大綱 簡介 什麼是特徵工程為什麼特徵工程在機器學習中如此重要 特徵工程的基本步驟 特徵選擇特徵創建特徵轉換特徵縮放 特徵選擇技術 過濾法&#xff08;Filter Methods&#xff09;包裝法&#xff08;Wrapper Methods&#xff09;嵌入法&#xff08;Embedded Methods&#xff…

Kotlin 继承

Kotlin 继承 概述 Kotlin,作为一门现代编程语言,提供了对面向对象编程(OOP)的全面支持,其中包括继承这一核心概念。继承允许我们创建一个新的类(称为子类)来继承另一个类(称为父类)的属性和方法。这样,子类不仅能够复用父类的代码,还能在此基础上添加新的功能或重…

算法工程师第四十一天( 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II )

参考文献 代码随想录 一、每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 …

(React/Vue+BPMN.js)前端项目——BPMN工作流设计器

bpmn-process-designer: Base on Vue 2.x and ElementUI&#xff0c;基于 Bpmn.js、Vue 2.x 和 ElementUI 的流程编辑器&#xff08;前端部分&#xff09;&#xff0c;支持监听器&#xff0c;扩展属性&#xff0c;表单等配置&#xff0c;可自由扩展 dingding-mid-business-java…

<Linux>进程概念-下

文章目录 目录 前言 一、环境变量 1. PATH 2. HOME 3. 其他环境变量 系统调用接口--getenv 4. 命令行参数 4.1 双参数main 4.2 三参数main 5. 设置环境变量 5.1 本地环境变量 5.1.1 内建命令 5.2 固定环境变量 6. 取消环境变量 7. 小总结 二、程序地址空间 1. 空间划分 2. 进…

数据结构+图的基本应用

一、问题描述 求有向图的简单路径 编写一个程序&#xff0c;设计相关算法完成以下功能。 &#xff08;1&#xff09;输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有简单路径。 &#xff08;2&#xff09;输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有长度为 3 的简单…

工业三防平板在数字化工厂建设中的重要趋势

在当今数字化浪潮的冲击下&#xff0c;工厂建设的数字化转型已,成为不可逆转的趋势。而在这一进程中&#xff0c;工业三防平板正逐渐斩露头角&#xff0c;发挥着越来越重要的作用。随着工业4.0理念的不断深入&#xff0c;工厂对于生产效率、质量控制、管理精细化的要求越来越高…

工厂模式与策略模式在Java中的应用案例分析

工厂模式与策略模式在Java中的应用案例分析 在Java的设计模式中&#xff0c;工厂模式和策略模式都是非常常见且实用的模式。它们各自解决了不同的问题&#xff0c;在复杂的系统设计中&#xff0c;这两种模式往往会结合使用&#xff0c;以提升代码的灵活性、可维护性和扩展性。…

【Linux 从基础到进阶】SSH 服务安全配置

SSH 服务安全配置 引言 SSH(Secure Shell)是 Linux 系统中广泛使用的远程登录协议,为用户提供了安全的加密通信。由于其广泛应用,SSH 服务也成为潜在攻击的目标。因此,确保 SSH 服务的安全性至关重要。本文将介绍如何在 CentOS 和 Ubuntu 系统中对 SSH 服务进行安全配置…

第1章 初识C语言

第1章 初识C语言 1.1 C语言概述 1.1.1 C语言的发展历史 C语言的原型为ALGOL 60语言&#xff08;也称A语言&#xff09;。 1963年 剑桥大学将ALGOL 60语言发展成为GPL语言。 1967年 剑桥大学的Matin Richards简化GPL&#xff0c;产生了BGPL语言。 1970年 美国贝尔实验室的Ken…

SpringMVC学习中遇到的不懂注解记录

文章目录 Autowrite 和 ResourceQualifier 和 PrimaryPathVariableController、Service、Repository 和 Component Autowrite 和 Resource 我们先讲讲 Autowrite 注解 吧。 public class StudentService3 implements IStudentService {//Autowiredprivate IStudentDao studentD…

推送本地windows环境镜像到阿里云镜像仓库

说明&#xff1a;从dockerhub拉取了apache/kafka3.7.0镜像到本地windwos操作系统上&#xff0c;再将该镜像推送到阿里云镜像仓库&#xff0c;记录了本次操作过程。 1、启动本地的docker desktop&#xff0c;搜索官方镜像 将搜索到的apache/kafka官方镜像拉取到本地 镜像拉取…

vscode 远程免密登录

Windows R 输入 cmd在命令行终端中输入 ssh-keygen 一直回车、确定 生成秘钥 3. C:\用户\xxx.ssh 拷贝公钥内容 id_rsa.pub 4. 在虚拟机~/.ssh/ 下创建文件touch authorized_keys,拷贝公钥内容 id_rsa.pub粘贴到authorized_keys里即可。

记录一次 Redis 优化发送数据(使用管道批量传送)

一 项目背景 此前的项目中&#xff0c;鉴于客户方服务器的安全配置对 MQ 中间件有所限制&#xff0c;我们只得采用 Redis 的 list 作为简易的 MQ 来传送报文数据。然而&#xff0c;近段时间客户关闭了相关端口&#xff0c;导致大量数据积压&#xff0c;需要进行补发。在补发过程…