【C++/STL】vector的OJ,深度剖析和模拟实现

vector在OJ中的使用
1.只出现一次的数字

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

2.杨辉三角

class Solution {
public:vector<vector<int>> generate(int numRows){vector<vector<int>> vv;vv.resize(numRows);for (size_t i = 0; i < vv.size(); i++){vv[i].resize(i + 1, 0);vv[i][i] = vv[i][0] = 1;}for (size_t i = 0; i < vv.size(); i++){for (size_t j = 0; j < vv[i].size(); j++){if (vv[i][j] == 0){vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j];}}}return vv;}
};

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.删除有序数组中的重复项

class Solution {
public:int removeDuplicates(vector<int>& nums) {int p=0,q=1;while(q<nums.size()){if(nums[p]==nums[q]){q++;}else{nums[++p]=nums[q];q++;}}return p+1;}
};

4.数组中出现次数超过一半的数字

class Solution {
public:int MoreThanHalfNum_Solution(vector<int>& numbers) {sort(numbers.begin(),numbers.end());int count=0;int middle=numbers[numbers.size()/2];for(int i=0;i<numbers.size();i++){if(numbers[i]==middle){count++;}}return (count>numbers.size()/2)?middle:0;// write code here}
};

5.在这里插入图片描述

class Solution
{string strA[10] = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
public:void Combine(string digits, int level, string combineStr, vector<string>& v){if (level == digits.size()){v.push_back(combineStr);return;}int num = digits[level] - '0';string str = strA[num];for (size_t i = 0; i < str.size(); i++){Combine(digits, level + 1, combineStr + str[i], v);}}vector<string> letterCombinations(string digits){vector<string> v;if (digits.empty()){return v;}Combine(digits, 0,"", v);return v;}
};

使用memcpy拷贝问题

int main()
{mm::vector<mm::string> v;v.push_back("1111");v.push_back("2222");v.push_back("3333");return 0;
}

假设模拟实现的vector中的reserve接口中,使用memcpy进行的拷贝,则:
1.memcpy是内存的二进制格式拷贝,将一段内存空间中的内容原封不动的拷贝到另一端内存中。
2.如果拷贝的是内置类型的元素,memcpy既高效又不会出错,但如果拷贝的是自定义类型元素,并且自定义类型元素中涉及到资源管理时,就会出错,因为memcpy的拷贝实际是浅拷贝
在这里插入图片描述
在这里插入图片描述
结论:如果对象中涉及到资源管理时,千万不能使用memcpy进行对象之间的拷贝,因为memcpy是
浅拷贝,否则可能会引起内存泄漏甚至程序崩溃。
注意:vector是深拷贝。但vector空间上存的对象是string的数组,使用memcpy导致string对象的浅拷贝。

for(size_t i=0;i<v.size();i++)
{_start[i]=v._start[i];
}

解决方案: T是string这样深拷贝的类,调用的是string赋值重载,实现string对象的深拷贝。
vector的模拟实现

#pragma once
#include <assert.h>
#include <iostream>
#include <algorithm>
namespace Q
{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;}// vector<int> v(10, 1);// vector<int> v(10u, 1);// vector<string> v1(10, "1111");//选择问题vector(size_t n, const T& val = T()){resize(n, val);}vector(int n, const T& val = T()){resize(n, val);}template <class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);++first;}}vector(const vector<T>& v){_start = new T[v.capacity()];//memcpy(_start,v._start,sizeof(T)*v.size());for (size_t i = 0; i < v.size(); i++){_start[i] = v._start[i];}/*_finish = v._finish;_endofstorage = v._endofstorage;*/_finish = _start + v.size();_endofstorage = _start + v.capacity();		}/*vector(const vector<T>& v){reserve(v.capacity());for (auto e : v){push_back(e);}}*/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> v){swap(v);return *this;}~vector(){if (_start){delete[] _start;_start = _finish = _endofstorage = nullptr;}}void reserve(size_t n){if (n > capacity()){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 = 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 push_back(const T& x){/*if (_finish == _endofstorage){size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);}*_finish = x;_finish++;*/insert(end(), x);}void pop_back(){erase(--end());}size_t capacity() const{return _endofstorage - _start;}size_t size() const{return _finish - _start;}T& operator[](size_t pos) {assert(pos < size());return _start[pos];}const T& operator[](size_t pos) const{assert(pos < size());return _start[pos];}iterator insert(iterator pos, const T& x){assert(pos >= _start && pos <=_finish);if (_finish == _endofstorage){size_t len = pos - _start;size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);pos = _start + len;}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;end--;}*pos = x;_finish++;return pos;}iterator erase(iterator pos){assert(pos >= _start && pos < _finish);iterator it = pos + 1;while (it != _finish){*(it - 1) = *it;it++;}_finish--;return pos;}private:iterator _start = nullptr;iterator _finish = nullptr;iterator _endofstorage = nullptr;};void print(){for (auto e : v){cout << e << " ";}cout << endl;}
}

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

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

相关文章

衡石湖仓一体架构深度解构:统一元数据层如何破除数据孤岛?

一、数据融合的世纪难题典型困境二、衡石统一元数据层设计架构核心关键技术实现智能元数据发现自动构建跨源血缘关系动态查询重写 将标准SQL翻译为最优执行计划text Original: SELECT SUM(sales) FROM virtual_view Rewritten: [S3] SELECT SUM(amount) FROM crm_sales [My…

Windows 下 fping 指令使用指南

fping 作为一款强大的网络工具&#xff0c;能够同时向多个主机发送 ICMP 回声请求&#xff0c;相较于传统的 ping 命令&#xff0c;在处理大量主机时具有显著优势。 一、fping 简介​ fping 是 “fast pinger” 的缩写&#xff0c;它可以向一系列 IP 地址发送 ICMP 回声请求。…

代码随想录day52图论3

文章目录101. 孤岛的总面积102. 沉没孤岛103. 水流问题104.建造最大岛屿101. 孤岛的总面积 题目链接 文章讲解 #include<bits/stdc.h> using namespace std;int ans 0; // 记录不与边界相连的孤岛数量 int sum 0; // 当前孤岛的面积 bool flag false; /…

linux pip/conda 修改默认cache位置

1 pip pip cache默认在/home/{username}目录下&#xff0c;容易导致系统盘写满报错。查看pip cache位置pip cache dir假设移动pip cache目录到 /data/.cache/pip/cache&#xff0c;命令如下pip config set global.cache-dir /data/.cache/pip/cache2 conda 查看conda缓存位置c…

如何解决pip安装报错ModuleNotFoundError: No module named ‘seaborn’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘seaborn’问题 一、摘要 在使用 PyCharm 终端进行模块安装时&#xff0c;常常会遇到如下异常&#xff1a; ModuleNotFoundError: No module named ‘seaborn’…

(思维)洛谷 P13551 ももいろの鍵 题解

题意 爱莉给了你一个非负整数 nnn&#xff0c;你需要把 0,1,2,…,n0, 1, 2, \dots, n0,1,2,…,n 划分成若干组&#xff0c;满足每一组的按位与为 000。 划分的组不需要相邻。 你需要最大化划分组数并给出方案。 1≤T≤6001 \le T \le 6001≤T≤600&#xff0c;0≤n≤1050 \le n…

记录一次ESP32报错Guru Meditation Error: Core 1 panic‘ed (Double exception).

一、问题描述 需求&#xff1a; ESP32S3单片机&#xff0c;连接一个麦克风读取5s后&#xff0c;编码后发送到百度云进行语音识别。通过freertos框架&#xff0c;将任务放在核1中运行&#xff08;放在核0同样报错&#xff09; 问题&#xff1a; 在最后的发送语音数据中&#xff…

半导体物理复习

半导体物理导论第一章 半导体的电子状态

vi/vim跳转到指定行命令

在 vi/vim 中跳转到指定行有多种高效方法&#xff0c;以下是最常用的操作方式&#xff1a; 一、基础跳转&#xff1a;行号 命令命令模式下直接输入行号 按 Esc 切换到命令模式后&#xff0c;输入 :行号 并回车。例如&#xff0c;输入 :100 会直接跳转到第 100 行。使用 G 快捷…

智能落地扇方案:青稞RISC-V电机 MCU一览

在科技飞速发展的今天&#xff0c;智能家居已成为人们生活中不可或缺的一部分&#xff0c;而风扇作为夏日解暑的必备家电&#xff0c;其智能化升级也成为了行业发展的必然趋势。传统落地扇功能单一、操作不便&#xff0c;已难以满足现代消费者对便捷、舒适、节能生活的追求。在…

SQL 中 WHERE 与 HAVING 的用法详解:分组聚合场景下的混用指南

SQL中WHERE与HAVING的用法详解&#xff1a;分组聚合场景下的混用指南 1. WHERE与HAVING的基本区别 在SQL查询中&#xff0c;WHERE和HAVING都是用于过滤数据的子句&#xff0c;但它们的应用时机和作用对象有本质区别&#xff1a; WHERE子句&#xff1a;在分组前对原始数据进行过…

14 - 大语言模型 — 抽取式问答系统 “成长记”:靠 BERT 学本事,从文本里精准 “揪” 答案的全过程(呆瓜版-1号)

目录 1、什么是问答系统&#xff1f; 2、问答系统的核心工作流程 2.1、理解问题&#xff1a;把问题 “翻译” 成机器能懂的形式 2.2、 寻找答案&#xff1a;从信息中定位答案 2.3、生成答案&#xff1a;整理并输出结果 2.4、优化迭代&#xff1a;让系统更 “聪明” 3、主…

Docker一键部署轻量级Gitea仓库

1、安装docker 1、安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm22、配置docker yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3、安装docker yum install -y docker-ce4、修改docker配置文…

2025年渗透测试面试题总结-2025年HW(护网面试) 81(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 81 一、Webshell获取路径规划 二、变形注入突破技巧 三、MySQL写入Webshell条件矩阵 …

8.1IO进程线程——文件IO函数

文章目录一、思维导图二、使用文件IO函数&#xff0c;实现文件的拷贝myhead.h代码现象三、使用标准IO函数&#xff0c;实现图片的拷贝代码现象四、使用文件IO函数&#xff0c;计算文件的大小代码现象五、牛客网刷题一、思维导图 二、使用文件IO函数&#xff0c;实现文件的拷贝 …

xerces-c-src_2_8_0 arm_linux编译

xerces-c-src_2_8_0 ARM LINUX 编译 文章借鉴&#xff1a;https://bbs.csdn.net/topics/250017321 export XERCESCROOT/xxxx/xerces-c-src_2_8_0 1 下载地址https://archive.apache.org/dist/xerces/c/sources/xerces-c-src_2_8_0.tar.gz&#xff1a;xerces-c-src_2_8_0.tar…

20250729使用WPS打开xlsx格式的电子表格时候隐藏显示fx的编辑栏的方法

20250729使用WPS打开xlsx格式的电子表格时候隐藏显示fx的编辑栏的方法 2025/7/29 9:44缘起&#xff1a;视图→编辑栏 截屏的时候&#xff0c;显示fx的编辑栏 占用空间了&#xff0c;很讨厌。 想办法拿掉&#xff01;

springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别

在Spring Boot中&#xff0c;ConfigurationProperties注解用于将外部配置文件&#xff08;如application.properties或application.yml&#xff09;中的属性映射到Java对象中。这种方式使得配置管理更加灵活和集中。而将配置信息存入数据库则是另一种管理应用程序配置的方式。这…

JVM指针压缩的那些事

什么是指针压缩&#xff1f;指针压缩&#xff08;Compressed Ordinary Object Pointers&#xff0c;简称Compressed OOPs&#xff09;是JVM在64位平台上的一种内存优化技术&#xff0c;它将64位的对象引用压缩为32位&#xff0c;从而减少内存占用并提升性能。为什么需要指针压缩…

【数据结构初阶】--排序(一):直接插入排序,希尔排序

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…