c++--vector

1.定義vector

vector的定義分為四種

(1)vector()? ?——————無參構造

(2)vector(size_t n,const value_type& val = value_type())? ?——————構造并初始化n個val

(3)vector(const vector& v1) ———————拷貝構造

(4)vector(inputiterator first,inputiterator last) ————使用迭代器進行初始化

代碼模擬實現:

namespace c_simplystudy:
{
template<class T>
class vector
{
public:vector(){_start = nullptr;_finish = nullptr;_endOfStorage = nullptr;}vector(int n, const T& value = T()):_start(new T[n]),_finish(_start+n),_endOfStorage(_finish){for (int i = 0; i < n; i++){*(_start + i) = value;}}
template<class InputIterator>vector(const vector<T>& v):_start(nullptr),_finish(nullptr), _endOfStorage(nullptr){reverse(v.capacity());iterator it = begin();const iterator last = cbegin();while (it != last){*it++ = *last++;}_finish = it;}vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);first++;}}
private:
iterator _start; // 指向數據塊的開始
iterator _finish; // 指向有效數據的尾
iterator _endOfStorage; // 指向存儲容量的尾
};
}

2.vector迭代器的使用與空間增長控制

迭代器:

?(1)begin()————獲取第一個數據位置的iterator/const_iterator

?(2)end()————獲取最后一個數據的下 一個位置的iterator/const_iterator

?(3)rbegin()————獲取最后一個數據位置的reverse_iterator

?(4)rend()————獲取第一個數據前一個位置的reverse_iterator

空間增長:
?(1)size()————獲取數據個數

?(2)capacity()————獲取容器容量

不同的編譯器下,容器“滿了”時,擴容的規則不同,在VS下是按1.5倍增長的,g++則是按2倍增長

?(3)empty()————判空

?(4)reserve()————改變capacity

reserve只負責開辟空間,如果確定知道需要用多少空間,reserve可以緩解vector增容的代 價缺陷問題

?(5)resize(n,val)————改變size(n為改變后的size,val為用于初始化的值)

如果n<size,則size=n,不進行初始化;如果n>capacity,則擴容至n,并且將未初始化的數據初始化為val

3.vector增刪查改

?(1)push_back()————尾插

?(2)?pop_back()————尾刪

?(3)find()————查找

如果存在則返回位置

?(4)insert()————插入

?(5)erase()————刪除

?(6)swap()————交換兩個vector

?(7)operate[]————下標索引

4.vector迭代器失效

vector的增刪會導致迭代器失效——實際就是迭代器底層對應指針所指向的空間被銷毀了,而使用一塊已經被釋放的空間,造成的后果是程序崩潰(即如果繼續使用已經失效的迭代器,程序可能會崩潰)

迭代器失效有兩種情況:

(1)當 it 用vector.begin()初始化后,如果對vector進行增或者可能會導致其擴容的操作,則vector在擴容時會釋放掉舊空間,begin()會指向新空間,而這里的 it 卻仍指向被釋放掉的舊空間,此時用 it 進行迭代器操作則會發生迭代器失效

int main()
{vector<int> v{1,2,3,4,5};auto it=v.begin();v.reserve(100);     //通過擴容使迭代器失效while(it != v.end()){cout << *it << " ";++it;}            //vs下會直接崩潰return 0;
}

(2)繼續將 it 用vector中的迭代器進行初始化,如果使用erase將 it 指向的迭代器刪除掉,則 it 指向的迭代器會失效,如果仍然對 it 進行解引用,則會發生報錯;erase刪除pos位置元素后,pos位置之后的元素會往前搬移,沒有導致底層空間的改變,理 論上講迭代器不應該會失效,但是:如果pos剛好是最后一個元素,刪完之后pos剛好是end 的位置,而end位置是沒有元素的,那么pos就失效了。因此刪除vector中任意位置上元素 時,vs就認為該位置迭代器失效了

#include <vector>
#include <algorithm>
int main()
{vector<int> v{1,2,3,4,5};vector<int>::iterator it = find(v.begin(), v.end(), 3);v.erase(it);while(it != v.end()){cout << *it << " ";++it;}          //因為空間還是原來的空間,后序元素往前搬移了,it的位置還是有效的//erase刪除的迭代器如果是最后一個元素,刪除之后it已經超過end//                         此時迭代器是無效的,++it導致程序崩潰return 0;
}

(此問題在string中也會出現,而且如果在linux環境下運行程序,由于g++編譯器對于迭代器失效的檢測并不嚴格,所以當迭代器失效后,對失效后的迭代器進行引用并不會報錯,但是運行結果已經不同)

迭代器失效解決方法在使用前,對迭代器重新賦值

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

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

相關文章

宇樹科技純技能要求總結

一、嵌入式開發與硬件設計 核心技能 嵌入式開發&#xff1a; 精通C/C&#xff0c;熟悉STM32、ARM開發熟悉Linux BSP開發及驅動框架&#xff08;SPI/UART/USB/FLASH/Camera/GPS/LCD&#xff09;掌握主流平臺&#xff08;英偉達、全志、瑞芯微等&#xff09; 硬件設計&#xff1a…

「Unity3D」UGUI運行時設置元素的錨點Anchor,維持元素Rect的顯示不變,即待在原處

在編輯器中&#xff0c;通過設置Raw edit mode&#xff0c;可以切換兩種&#xff0c;元素錨點的改變模式&#xff1a; 一種是錨點單獨改變&#xff0c;即&#xff1a;不開啟原始模式&#xff0c;保持原樣&#xff0c;改變anchoredPosition與sizeDelta。一種是錨點聯動顯示&…

使用 Google Firebase 控制臺和 ESP8266 NodeMCU 的物聯網控制 LED

使用 Google Firebase 控制臺控制 LED ESP8266 您是否想過從世界任何地方控制任何外圍設備?是的,IoT(物聯網)使從任何地方控制任何設備成為可能,并且有許多 IoT 硬件和云平臺可用于實現這一目標。在前面的教程中,我們已經介紹了許多 IoT 應用程序。今天,我們將使用 Goo…

【數據庫】如何用索引優化查詢性能

引言 在數據庫查詢中&#xff0c;索引是提升性能的關鍵工具。合理使用索引可以顯著減少數據掃描量&#xff0c;加快查詢速度。然而&#xff0c;索引的使用也需要謹慎&#xff0c;錯誤的索引策略可能導致性能下降甚至系統崩潰。本文將深入探討如何通過索引優化查詢性能&#xf…

LeetCode 392. 判斷子序列 java題解

https://leetcode.cn/problems/is-subsequence/description/ 轉化為最長公共子序列問題。求[lens][j]的公共子序列長度是否為lens。 class Solution {//s屬于t,lens<lentpublic boolean isSubsequence(String s, String t) {int lenss.length(),lentt.length();if(s.length…

【Kubernetes】Kube Proxy 如何幫助 Pod 之間通信?Kube-Proxy 實踐案例

kube-proxy 主要通過管理網絡規則和流量轉發來幫助 Pod 之間進行通信&#xff0c;具體方式如下&#xff1a; 1. 維護 Service 相關的網絡規則 kube-proxy 監聽 API Server&#xff0c;當 Service 或 Endpoints 發生變化時&#xff0c;動態更新網絡規則。確保流量能正確地從 S…

平衡樹的模擬實現

一.平衡樹的介紹 平衡樹是以二叉樹結構為基礎&#xff0c;同時引入了平衡因子進行了限制&#xff0c;以保證樹的結點之間的高度差小于等于1&#xff0c;在插入刪除結點時通過旋轉的方法保持高度相對平衡&#xff0c;從而提高搜索等效率。 二.代碼實現 1.平衡樹結點 平衡樹結…

JavaScript基礎-獲取元素

在Web開發中&#xff0c;使用JavaScript動態地訪問和操作網頁上的元素是一項基本技能。通過獲取頁面上的特定元素&#xff0c;我們可以對其進行各種操作&#xff0c;比如修改內容、樣式或屬性等。本文將詳細介紹幾種獲取DOM元素的方法&#xff0c;并探討它們的特點及適用場景。…

為什么要用(:deep、::v-deep、>>>)樣式穿透

在 Vue.js 中&#xff0c;當你使用像 Element UI 這樣的 UI 庫時&#xff0c;它們的樣式通常是全局的&#xff0c;即使你在組件中使用了 scoped 樣式&#xff08;為什么要用scoped&#xff09;&#xff0c;仍然可能需要對這些全局樣式進行修改。 為了實現這一點&#xff0c;樣…

MySQL中的事務隔離級別有哪些

MySQL中的事務隔離級別 一、事務并發問題二、MySQL 事務隔離級別1. READ UNCOMMITTED&#xff08;讀未提交&#xff09;2. READ COMMITTED&#xff08;讀已提交&#xff09;3. REPEATABLE READ&#xff08;可重復讀&#xff09;&#xff08;MySQL 默認級別&#xff09;4. SERIA…

Python----計算機視覺處理(Opencv:圖像鏡像旋轉)

一、圖像鏡像旋轉 圖像的旋轉是圍繞一個特定點進行的&#xff0c;而圖像的鏡像旋轉則是圍繞坐標軸進行的。圖像鏡像旋轉&#xff0c;也可 以叫做圖像翻轉&#xff0c;分為水平翻轉、垂直翻轉、水平垂直翻轉三種。 通俗的理解為&#xff0c;當以圖片的中垂線為x軸和y軸時&#x…

hibernate 自動生成數據庫表和java類 字段順序不一致 這導致添加數據庫數據時 異常

hibernate 自動生成的數據庫表和java類 字段順序不一致 這導致該書寫方式添加數據庫數據時 異常 User user new User( null, username, email, phone, passwordEncoder.encode(password) ); return userRepository.save(user);Hibernate 默認不會保證數據庫表字段的順序與 Ja…

python|結構的模式匹配match|同步迭代

在 Python 中&#xff0c;模式匹配&#xff08;Pattern Matching&#xff09; 是一種強大的功能&#xff0c;用于根據數據的結構或內容進行匹配和處理。Python 3.10 引入了 match 語句&#xff0c;使得模式匹配更加直觀和靈活。模式匹配可以用于處理復雜的數據結構&#xff0c;…

博客圖床 VsCode + PigGo + 阿里云OSS

關鍵字 寫博客&#xff0c;圖床&#xff0c;VsCode&#xff0c;PigGo&#xff0c;阿里云OSS 背景環境 我想把我在本地寫的markdown文檔直接搬到CSDN上和博客園上&#xff0c;但是圖片上傳遇到了問題。我需要手動到不同平臺上傳文件&#xff0c;非常耗費時間和經歷。 為了解決…

路由器安全研究:D-Link DIR-823G v1.02 B05 復現與利用思路

前言 D-Link DIR-823G v1.02 B05存在命令注入漏洞&#xff0c;攻擊者可以通過POST的方式往 /HNAP1發送精心構造的請求&#xff0c;執行任意的操作系統命令。 漏洞分析 binwalk提取固件&#xff0c;成功獲取到固件。 現在我們已經進入到應用里了&#xff0c;那么我們在進行分析…

c++ 類和對象 —— 下 【復習總結】

1. 深入構造函數 1.1 函數體賦值 前文我們提到&#xff0c;創建對象時&#xff0c;編譯器會調用構造函數給成員變量賦值。但這并不能稱為對對象中成員變量的初始化。因為初始化只能初始化一次&#xff0c;但構造函數體內可以多次賦值。構造函數體中語句只能稱為賦初值 那么&…

【量化科普】Volatility,波動率

【量化科普】Volatility&#xff0c;波動率 &#x1f680;量化軟件開通 &#x1f680;量化實戰教程 在金融市場中&#xff0c;波動率&#xff08;Volatility&#xff09;是衡量資產價格變動幅度的一個重要指標。它反映了資產價格的穩定性和風險水平。高波動率意味著資產價格…

PCIe(Peripheral Component Interconnect Express)詳解

一、PCIe的定義與核心特性 PCIe&#xff08;外設組件互連高速總線&#xff09;是一種 高速串行點對點通信協議&#xff0c;用于連接計算機內部的高性能外設。它取代了傳統的PCI、PCI-X和AGP總線&#xff0c;憑借其高帶寬、低延遲和可擴展性&#xff0c;成為現代計算機系統的核…

idea 編譯打包nacos2.0.3源碼,生成可執行jar 包常見問題

目錄 問題1 問題2 問題3 問題4 簡單記錄一下nacos2.0.3&#xff0c;編譯打包的步驟&#xff0c;首先下載源碼&#xff0c;免積分下載&#xff1a; nacos源碼&#xff1a; https://download.csdn.net/download/fyihdg/90461118 protoc 安裝包 https://download.csdn.net…

通過 TTL 識別操作系統的原理詳解

TTL 的工作原理 TTL&#xff08;Time to Live&#xff0c;生存時間&#xff09;是網絡中用于控制數據包生命周期的一個關鍵參數。它通過限制數據包在網絡中可以經過的最大路由跳數&#xff08;或最大轉發時間&#xff09;&#xff0c;確保數據包不會在網絡中無休止地轉發。TTL…