【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
英文地址,請注明出處:http://en.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;毅力是永久的…