vector的模拟实现以及oj题

news2024/9/24 18:01:48

前言

上篇博客介绍了voctor的大部分的重要接口,本篇博客将模拟实现部分接口的效果。

vector的模拟实现

vector的模拟实现分为两个文件进行实现:vector.h、test.cpp

  • vector.h

该部分为文件的主要部分,分别实现了vector的以下功能(思路):
1)begin()、end()以及const begin()、 const end()。 直接返回_start和_finish即可。
2)size。_finish和_start两个指针的差,即为数据的大小。
3)capacity。_end_of_storage和_start两个指针的差,即为容量的大小。
4)reserve。判断是否需要扩容,需要则进行扩容,注意迭代器失效问题。
5)empty。判断_start和_finish是否相等,相等则为空。
6)push_back。首先判断是否需要扩容,然后再将数据进行插入。
7)pop_back。直接将_finish减少一个即可,下次插入时,下一个数据会被覆盖。
8)insert。判断是否需要扩容,接着将数据往后挪,再将新的数据进行插入。
9)operator[]。判断是否会超出vector的范围,若在范围内则直接进行输出即可。

#include<iostream>
#include<assert.h>
using namespace std;

namespace vector_by_self
{
	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;
		}

		void reserve(size_t x)
		{
			if (x > capacity())
			{
				size_t oldsize = size();
				T* tmp = new T[x];
				memcpy(tmp, _start, sizeof(T) * oldsize);
				delete[] _start;
				_start = tmp;
				_finish = oldsize + tmp;
				_end_of_storage = x+tmp;
			}
		}

		bool empty()
		{
			return _finish == _start;
		}

		void push_bcak(const T& x)
		{
			if (_finish == _end_of_storage)
			{
				reserve(capacity() == 0 ? 4 : capacity() * 2);
			}
			*_finish = x;
			_finish++;
		}

		void pop_back()
		{
			assert(!empty());
			--_finish;
		}

		iterator insert(iterator pos, const T& x)
		{
			if (_finish == _end_of_storage)
			{
				size_t tmp = pos - _start;
				reserve(capacity() == 0 ? 4 : capacity()*2);
				pos = _start + tmp;
			}
			iterator end = _finish-1;
			while(end >= pos)
			{
				*(end + 1) = *end;
				end--;
			}
			*pos = x;
			_finish++;
			return pos;
		}

		T& operator[](size_t x)
		{
			assert(x < size());
			return _start[x];
		}

		const T& operator[](size_t x) const
		{
			assert(x < size());
			return _start[x];
		}

	private:
		iterator _start = nullptr;
		iterator _finish = nullptr;
		iterator _end_of_storage = nullptr;
	};

	template<class T>
	void vector_print(const vector<T> v)
	{
		//typename vector<T>::const_iterator it = v.begin();
		auto it = v.begin();
		while (it != v.end())
		{
			cout << *it << " ";
			it++;
		}
		cout << endl;
	}

	void vector_test1()
	{
		vector<int> v;
		v.push_bcak(1);
		v.push_bcak(2);
		v.push_bcak(3);
		v.push_bcak(4);
		v.push_bcak(5);
		v.push_bcak(6);

		vector_print(v);
		cout << v.size() << endl;
		cout << v.capacity() << endl;

		v.pop_back();
		vector_print(v);

		v.insert(v.begin(), 9);
		vector_print(v);
	}
}
  • test.cpp
#include"vector.h"

int main()
{
	vector_by_self::vector_test1();
	return 0;
}

请添加图片描述

vector的oj题

只出现一次的数字

只出现一次的数字-力扣
在这里插入图片描述

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int once=0;
        for(auto i:nums)
        {
            once ^= i;
        }
        return once;
    }
};

请添加图片描述

杨辉三角

杨辉三角-力扣
在这里插入图片描述
思路:

  1. 利用vector实现二维数组的效果,将值都初始化成1
  2. 从第三层开始将中间的数字进行计算
class Solution {
public:
    vector<vector<int>> generate(int numRows) 
    {
        vector<vector<int>> vv(numRows);
        for(int i=0;i<numRows;i++)
        {
            vv[i].resize(i+1,1);
        }
        for(int i=2;i<numRows;i++)
        {
            for(int j=1;j<i;j++)
            {
                vv[i][j]=vv[i-1][j]+vv[i-1][j-1];
            }
        }
    return vv;
    }
};

请添加图片描述

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

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

相关文章

VSCode扩展连接虚拟机MySQL数据库

在虚拟机安装MySQL vscode通过ssh远程登录Ubuntu 在vscode终端运行以下命令。 sudo apt-get install mysql-server-5.7 用以下命令确认MySQL是否安装完成。 sudo mysql MySQL安装成功。 在VSCode安装SQL扩展 扩展名&#xff1a;MySQL Shell for VS Code。 安装完成后&am…

oracle各种版本在各种系统上安装配置需求快速参考

Oracle Database (RDBMS) on Unix AIX,HP-UX,Linux,Solaris and MS Windows Operating Systems Installation and Configuration Requirements Quick Reference (12.1/12.2/18c/19c) (Doc ID 1587357.1)

(14)关于docker如何通过防火墙做策略限制

关于docker如何通过防火墙做策略限制 1、iptables相关问题 在Iptables防火墙中包含四种常见的表&#xff0c;分别是filter、nat、mangle、raw。 filter&#xff1a;负责过滤数据包。 filter表可以管理INPUT、OUTPUT、FORWARD链。 nat&#xff1a;用于网络地址转换。 nat表…

边缘计算网关在工业中的应用

在工业4.0和智能制造的浪潮中&#xff0c;边缘计算网关扮演着至关重要的角色。AIoTedge边缘计算网关&#xff0c;作为工业互联网的关键组件&#xff0c;通过其强大的数据处理能力和智能分析功能&#xff0c;正在改变工业生产的面貌。 边缘计算网关的定义与角色 边缘计算网关是…

apache paimon简介(官翻)

介绍 如下架构所示: 读/写操作: Paimon 支持多样化的数据读写方式,并支持 OLAP 查询。 读取: 支持从历史快照(批处理模式)中消费数据,从最新偏移量(流处理模式)中读取数据,或以混合方式读取增量快照。写入: 支持从数据库变更日志(CDC)进行流式同步,从离线数据中…

sicp每日一题[2.24-2.27]

2.24-2.26没什么代码量&#xff0c;所以跟 2.27 一起发吧。 Exercise 2.24 Suppose we evaluate the expression (list 1 (list 2 (list 3 4))). Give the result printed by the interpreter, the corresponding box-and-pointer structure, and the interpretation of this a…

Vue3:自定义customRef

目录 一.性质 1.自定义性 2.工厂函数参数 3.track 和 trigger 函数 二.作用 1.防抖/节流 2.异步更新 3.条件性更新 4.精细控制依赖追踪 5.优化性能 三.使用 1.ts组件 2.vue.组件 四.代码 1.ts代码 2.vue代码 五.效果 在 Vue 3 中&#xff0c;customRef 是一个…

YOLOv10改进,YOLOv10主干网络替换为VanillaNet( CVPR 2023 华为提出的全新轻量化架构),大幅度涨点

摘要 基础模型的核心理念是“更多即不同”,这一理念在计算机视觉和自然语言处理领域取得了惊人的成功。然而,变压器模型的优化挑战和固有复杂性呼唤一种向简化转变的范式。在本研究中,引入了 VanillaNet,一种拥抱设计优雅的神经网络架构。通过避免高深度、快捷方式和复杂操…

java开发jmeter采样器

目录 1.前言 2.新建一个springboot工程 2.1 引入相关依赖 2.2 编写核心代码 2.2.1 取样器代码 2.2.2 取样器界面 2.2.3 sdk接口封装 3.源码打包 3.1 将sdk源码和采样器源码打成jar包 3.2 拷贝引用包 4.配置jmeter脚本 4.1 选择自定义采样器 4.2 界面里面配置参数 1.…

“一屏显江山”,激光显示重构「屏中世界」

【潮汐商业评论/原创】 2024年国庆期间&#xff0c;曾感动过无数国人的舞蹈诗剧《只此青绿》改编的同名电影即将上映&#xff0c;而这一次观众们不必走进电影院&#xff0c;在家里打开官方合作的海信激光电视也能享受到同等的视听效果&#xff0c;这是激光电视在观影场景领域的…

【卡片 / A】

题目 代码 #include <bits/stdc.h> using namespace std; int cnt[10]; bool consume(int x) {int need[10] {0};while (x){int k x % 10;need[k];x / 10;}for (int i 0; i < 10; i){if (cnt[i] < need[i])return false;}for (int i 0; i < 10; i){cnt[i] …

基于 RealSense D435i相机实现手部姿态检测

基于 RealSense D435i相机进行手部姿态检测&#xff0c;其中采用 Mediapipe 进行手部检测&#xff0c;以下是详细步骤&#xff1a; Mediapipe 是一个由 Google开发的开源框架&#xff0c;专门用于构建多媒体处理管道&#xff0c;特别是计算机视觉和机器学习任务。它提供了一系列…

OLED(2)驱动篇

文章目录 1 概述2 代码简述2.1 OLED 对象2.2 OLEDProtocol 对象2.3 OLEDFont 对象 3 成果展示 1 概述 1&#xff09;代码仓库&#xff1a;这里尝试了两种面向对象的方式&#xff0c;不足之处敬请指正。 OOP 方式&#xff1a;https://gitee.com/luyaocf/demo-jlc_stm32f407_oop.…

【逐行注释】扩展卡尔曼滤波EKF和粒子滤波PF的效果对比,MATLAB源代码(无需下载,可直接复制)

文章目录 总述源代码运行结果改进方向总述 本代码使用 M A T L A B MATLAB MATL</

2024最新金九银十必问面试题大全

我花了三天时间&#xff0c;整理了100道最经典的常见测试面试题&#xff08;附答案&#xff09;&#xff01;完整版文档见文末&#xff01; 1、所做项目的情况&#xff0c;主要做什么类型的测试&#xff1f; 2、你在测试中发现了一个bug&#xff0c;但是开发经理认为这不是一…

基于yolov5的中国交通标志TT100K检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的中国交通标志TT100K检测系统是一种利用深度学习技术实现高效、准确交通标志识别的系统。该系统采用YOLOv5作为核心检测算法&#xff0c;凭借其速度快、准确性高的特点&#xff0c;在实时交通标志识别领域展现出显著优势。 TT100K数据集作为该系统的…

【学术会议征稿】2024年先进控制系统与自动化技术国际学术会议(ACSAT 2024)

2024年先进控制系统与自动化技术国际学术会议&#xff08;ACSAT 2024&#xff09; 2024 International Conference on Advanced Control Systems and Automation Technologies 2024年先进控制系统与自动化技术国际学术会议&#xff08;ACSAT 2024&#xff09;将于2024年11月15…

大模型推理革新:探索思维图(DoT)框架的逻辑与应用

姚期智院士领衔推出了大模型新推理框架&#xff0c;CoT的“王冠”已难以承载。 提出了思维图&#xff08;Diagram of Thought&#xff0c;DoT&#xff09;&#xff0c;使大模型的思考方式更接近人类。 团队为这一推理过程提供了数学基础&#xff0c;通过拓扑斯理论&#xff0…

【Finetune】(六)、transformers之IA-3微调

文章目录 0、IA-3基本原理1、IA-3微调实战1.1、导包1.2、加载数据集1.3、数据预处理1.4、创建模型1.5、LORA微调1.5.1、配置文件1.5.2、创建模型 1.6、配置训练参数1.7、创建训练器1.8、模型训练1.9、模型推理 0、IA-3基本原理 IA3的基本思想就是抑制和放大内部激活&#xff0c…

外包功能测试干了4年,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;本科生生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了差不多4年的功能测试&#xff0c;今年中秋&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能…