C++vector部分實現及感悟

myvector.h
#pragma once
#include<assert.h>
#include<iostream>
#include<vector>
using namespace std;
namespace bit {template<class T>//必須使用typename場景\template<typename T>與template<class T>一般情況下這兩個通用,但有一個特例,就是當 T 是一個類,而這個類又有子類(假設名為 innerClass) 時,應該用 template<typename>:\typename T::innerClass myInnerObject; 這里的 typename 告訴編譯器,T::innerClass 是一個類,程序要聲明一個 T::innerClass 類的對象,而不是聲明 T 的靜態成員,而 typename 如果換成 class 則語法錯誤。class vector{public:typedef T* iterator;typedef const T* const_iterator;//const指針得到const迭代器,非const得非const迭代器const_iterator begin()const{return _start;}const_iterator end()const{return _end;}iterator begin(){return _start;}iterator end(){return _end;}// 類模板的成員函數
// 函數模板 -- 目的支持任意容器的迭代器區間初始化template<class InputIterator>vector(InputIterator it_begin, InputIterator it_end){while (it_begin != it_end){push_back(*(it_begin++));}}vector() = default;vector(size_t n, const T& val = T()){reserve(n);//盡量一次性開空間for (size_t i = 0; i < n; i++)//和n同一類型大小push_back(val);}vector(initializer_list<T> il){reserve(il.size());//要push_back,insert等頻繁插入數據就想優化一次插入for (auto& e : il)//初始列表支持迭代器就支持范圍for從頭往后{push_back(e);}}vector(int n, const T& val = T())//要有int版本的不然傳兩個數字為int與迭代器模板函數混淆{reserve(n);//盡量一次性開空間for (int i = 0; i < n; i++)//和n同一類型大小push_back(val);}vector(const vector<T>& v){//拷貝構造實現深度拷貝reserve(v.capacity());for (auto& e : v){push_back(e);}}void swap(vector<T>&v){std::swap(this->_start, v._start);std::swap(this->_end, v._end);std::swap(this->_end_of_storage, v._end_of_storage);}vector<T>& operator=(vector<T> v)//現代寫法,可以傳參的拷貝實參,深拷貝再交換自動析構{swap(v);return *this;//可以連續運算的返回其值}~vector(){if (_start){delete[] _start;_start = _end_of_storage = _end = nullptr;}}void reserve(size_t n)//size_t{//不能用memcpy拷貝新舊空間,淺拷貝的空間會析構兩次if (n > capacity()){size_t oldsizes = size();iterator new_start = new T[n];for (size_t i = 0; i < oldsizes; i++){new_start[i] = _start[i];}delete[] _start;_start = new_start;_end = _start + oldsizes;_end_of_storage = _start+n;}}size_t capacity()const //僅訪問的允許常this指針{return _end_of_storage - _start;}size_t size()const{return _end - _start;}T& operator[](size_t n){assert(n < size());//訪問越界檢查return _start[n];}const T& operator[](size_t n)const//常指針訪問返回常引用[]{assert(n < this->size());return _start[n];}void push_back(const T& val){//if (_end == _end_of_storage)//{//	size_t capacity = capacity() == 0 ? 4 : 2 * capacity();//	reserve(capacity);//}//*_end++ = val;//后置++優先級大于解引用insert(end(), val);}void popback(){assert(size());--_end;}iterator insert(iterator pos, const T& val)//pos迭代器不能傳引用,不然外部不能拷貝傳參臨時變量引用,insert(t.begin()->傳的臨時變量不能傳普通引用{//這里形參如果是引用的話,則編譯時會報錯,因為v.begin()返回的是一個臨時變量,自定義類型傳值拷貝返回,返回臨時變量再拷貝給接收的,是一個右值,它不能賦值給一個非const的引用: assert(pos <= _end);assert(pos >= _start);if (_end == _end_of_storage){size_t len = pos - _start;size_t capacity = this->capacity() == 0 ? 4 : this->capacity() * 2;reserve(capacity);pos = _start + len;//內部迭代器更新}iterator end = _end-1;while (end >= pos){*(end + 1)=*end;end--;}_end++;*pos = val;return pos;}iterator erase(iterator pos){assert(pos < _end);assert(pos >= _start);iterator pos_i = pos+1;while (pos_i < _end)*(pos_i - 1) = *pos_i++;--_end;return pos;}private://在類型定義后寫iterator _start = nullptr;iterator _end = nullptr;iterator _end_of_storage = nullptr;};
}
void test01()
{bit::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);size_t size = v1.size();for (int i = 0; i < size; i++)cout << v1[i] << endl;for (const auto& e : v1)cout << e << endl;bit::vector<int>::iterator it_begin = v1.begin();bit::vector<int>::iterator it_end = v1.end();for (; it_begin < it_end; it_begin++)cout << *it_begin << endl;}void test02()
{bit::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);v1.insert(v1.begin(), 0);size_t size = v1.size();for (int i = 0; i < size; i++)cout << v1[i] << " ";cout << endl;for (const auto& e : v1)cout << e << " ";cout << endl;v1.erase(v1.end() - 1);bit::vector<int>::iterator it_begin = v1.begin();bit::vector<int>::iterator it_end = v1.end();for (; it_begin < it_end; it_begin++)cout << *it_begin << " ";cout << endl;int x;cin >> x;bit::vector<int>::iterator pos_x = find(v1.begin(), v1.end(), x);//模板實例化才能找類域if (pos_x != v1.end()){pos_x =v1.insert(pos_x, 1000);// 建議失效后迭代器不要訪問。除非賦值 更新 一下這個失效的迭代器cout << *pos_x << endl;}for (const auto& e : v1)cout << e << " ";cout << endl;}
void test03()
{std::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);int x;cin >> x;std::vector<int>::iterator it = find(v1.begin(), v1.end(), x);if (it != v1.end()){// erase it以后,it是否失效呢?失效it = v1.erase(it);if (it != v1.end())cout << *it << endl;}cout << typeid(it).name() << endl;
}
void test_vector4()
{std::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);std::vector<int>::iterator it = v1.begin();while (it < v1.end())//用迭代器遍歷并刪除偶數{if (*it % 2 == 0){it = v1.erase(it);}else++it;}for (auto e : v1){cout << e << " ";}cout << endl;
}
void test_vector5()
{bit::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);bit::vector<int> v2(v1);for (auto e : v2){cout << e << " ";}cout << endl;bit::vector<int> v3;v3.push_back(10);v3.push_back(20);v3.push_back(30);v1 = v3;for (auto e : v1){cout << e << " ";}cout << endl;
}
void test_vector07()
{int i = int();int k(2);int f = { 3 };int h = int(7);int j{ 1 };
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22032.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jmeter實戰教程入門講解

前言 通過前面對Jmeter元件的講解&#xff0c;大家應該都知道常用元件的作用和使用了。編寫Jmeter腳本前我們需要知道Jmeter元件的執行順序&#xff0c;可以看看我這篇性能測試學習之路&#xff08;三&#xff09;—初識Jmeter來了解下。下面我將以工作中的一個簡單的實例帶大…

Flutter 中的 TableCell 小部件:全面指南

Flutter 中的 TableCell 小部件&#xff1a;全面指南 Flutter 是一個功能強大的 UI 框架&#xff0c;由 Google 開發&#xff0c;允許開發者使用 Dart 語言構建跨平臺的移動、Web 和桌面應用。在 Flutter 的豐富組件庫中&#xff0c;TableCell 是一個用于創建表格單元格的組件…

企業打款驗證API在Java、Python、PHP中的使用教程

隨著企業銀行賬號數量的增加和銀行間的連接方式不斷豐富&#xff0c;企業在進行資金交易時需要確保所填寫的收款方賬戶信息的準確性和合法性&#xff0c;以避免資金損失和風險。然而&#xff0c;由于銀行數量眾多、地域分布廣泛&#xff0c;不同銀行間的賬戶驗證機制和信息交互…

vue前端實現頁面禁止縮放 前端適配問題處理 前端項目多端適配解決方案

在前端項目中,如果一個系統頁面可以縮放可能會導致多種異常情況,這些異常情況涉及到頁面布局、元素尺寸、事件觸發、響應式設計和用戶體驗等方面。 1.布局錯亂:頁面元素在縮放后可能會出現錯位、重疊或部分隱藏的情況,導致頁面布局混亂,影響用戶對頁面內容的理解和操作。這…

【云原生】kubernetes中secret原理詳解與應用實戰

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

讀AI未來進行式筆記02深度偽造

1. 計算機視覺 1.1. 在人的六感之中&#xff0c;視覺是最重要的 1.1.1. 人類只要看上一眼視頻&#xff0c;就能瞬間在腦海中抓取并消化內容和信息 1.1.2. 人類能夠對事物進行廣義的理解和抽象的認知&#xff0c;即使同一物體在不同的角度…

聲量2024 | 內容創作者,該怎樣保護你的知識產權

點擊文末“閱讀原文”即可參與節目互動 剪輯、音頻 / 卷圈 運營 / SandLiu 卷圈 監制 / 姝琦 封面 / 姝琦Midjourney 產品統籌 / bobo 場地支持 / 阿那亞 聯合制作 / 聲量The Power of Voice 特別鳴謝 / 深夜談談播客網絡 本期節目錄制于第二屆「聲量The Power of Voic…

opencascade 布爾運算筆記

BRepAlgoAPI_Common 對兩個topods求解 沒有公共部分也返回結果了 我想要的結果是沒有公共部分返回false 在 Open CASCADE 中使用 BRepAlgoAPI_Common 進行布爾操作時&#xff0c;即使兩個 TopoDS_Shape 沒有公共部分&#xff0c;操作仍會返回一個結果。為了判斷兩個形狀是否確…

vue3封裝echarts組件---通俗易懂

1、封裝的原因 如果在vue項目中有多個組件或者同個組件多出地方需要不同的圖表&#xff0c;因此自己封裝一個方便多次復用的Mycharts圖表組件。 2、具體步驟&#xff1a; 2.1 安裝echarts pnpm i echarts --save 2.2 新建MyCharts組件 : ~components/echarts/MyCharts.vu…

x264 參考幀管理原理:i_poc 變量

POC H.264中的POC(Picture Order Count)用于表示解碼幀的顯示順序。當視頻碼流中存在B幀時,解碼順序和顯示順序可能不一致,因此需要根據POC來重新排列視頻幀的顯示順序,以避免跳幀或畫面不連貫的問題。 具體來說,POC的作用包括: 重排顯示順序:POC確保即使在存在B幀的情…

基于javacv ffmpeg 使用原生ffmpeg命令

基于javacv ffmpeg 使用原生ffmpeg命令 1. ffmpeg2. ffprobe 相關閱讀&#xff1a; javacv ffmpeg使用筆記 測試過程中&#xff0c;發現ffmpeg-6.0-1.5.9-linux-x86_64.jar 存在問題&#xff08;ffmpeg原生命令執行失敗&#xff09;&#xff0c;降級到ffmpeg-5.1.2-1.5.8-linux…

RPG Maker MV 踩坑十一 精靈及背景繪制問題

精靈繪制問題 RPG Maker MV戰斗問題入場飛身戰斗背景繪制精靈集及精靈 RPG Maker MV戰斗問題 在RMMV中戰斗是在場景中調用戰斗管理器&#xff0c;通過管理器去操作角色對象行動及精靈的繪制的。 入場飛身 在其中就發現一個問題加載圖片進場時&#xff0c;會偏高&#xff0c;…

Python編程學習第一篇——Python零基礎快速入門(五)—元組(Tuple)操作

Python元組是一種不可變的有序集合&#xff0c;可以存儲多個不同類型的數據。元組使用小括號來表示&#xff0c;其中的元素用逗號分隔開。與列表不同&#xff0c;元組的元素不能被修改、刪除或添加。它的一些常規操作包括元組的創建、訪問、添加、修改、刪除、運算等等&#xf…

電力電子功率模塊在工程應用中測溫NTC的使用

電力電子功率模塊在工程應用中測溫NTC的使用 1.概述2.什么是NTC3.模塊內部NTC3.1 絕緣隔離措施3.2 NTC熱量考慮 4.使用模擬方法測量NTC溫度4.1 分壓電阻大小 5.使用數字方法測量NTC溫度 1.概述 最近做項目的時候突然被問到一個問題。做實驗測溫用的NTC到底怎么用&#xff1f;為…

【Python】超時請求或計算的處理

超時機制 一般應用于處理阻塞問題 場景&#xff1a; 復雜度較大的計算&#xff08;解析&#xff09;某個數值、加解密計算等請求中遇到阻塞&#xff0c;避免長時間等待網絡波動&#xff0c;避免長時間請求&#xff0c;浪費時間 1. requests 請求超時機制 reqeusts 依賴中的…

[大師C語言(第十九篇)]C語言函數式編程技術詳解

引言 函數式編程&#xff08;Functional Programming&#xff0c;FP&#xff09;是一種編程范式&#xff0c;強調通過使用純函數和不可變數據來編寫代碼。這種范式具有許多優點&#xff0c;如易于測試、可維護性高、并發友好等。盡管C語言被認為是一種過程式編程語言&#xff…

JAVA設計模式-策略模式及在Springboot2.X中寫法

JAVA設計模式-策略模式及在Springboot2.X中寫法 一、經典的策略模式寫法二、Springboot2.X中策略模式寫法 策略模式的定義&#xff1a;策略模式是一種行為型設計模式,定義了一系列算法,并將每個算法封裝起來,使它們可以互相替換 策略模式&#xff1a;在策略模式&#xff08;Str…

算法 java 排序和查找

排序和查找 冒泡排序&#xff08;穩定&#xff09;選擇排序&#xff08;不穩定&#xff09;插入排序&#xff08;穩定&#xff09;希爾排序&#xff08;不穩定&#xff09;歸并排序&#xff08;穩定&#xff09;快速排序&#xff08;不穩定&#xff09;堆排序計數排序桶排序基數…

YOLOv8+PyQt5海洋船只檢測(可以重新訓練,yolov8模型,從圖像、視頻和攝像頭三種路徑識別檢測)

1.效果視頻&#xff1a;海洋船只檢測yoloV8檢測&#xff08;https://mbd.pub/o/bread/mbd-ZpaYk55r&#xff09;_嗶哩嗶哩_bilibili資源包含可視化的海洋船只檢測系統&#xff0c;可對于高空拍攝到的海洋圖片進行輪船檢測&#xff0c;基于最新的YOLOv8訓練的海洋船只檢測模型&a…

多線程知識-11

Runnable 和 Thread 用哪個好 使用Runnable接口的好處是&#xff1a; 避免了單繼承的限制&#xff1a;當你的類已經繼承了另一個類時&#xff0c;你仍然可以實現Runnable接口來創建線程。提高代碼的復用性&#xff1a;你可以將Runnable對象傳遞給多個線程來執行&#xff0c;從…