C++STL詳解+代碼分析+典例講解

vector 的介紹:

1、vector是表示可變大小數組的序列容器。
2、vector就像數組一樣,也采用的連續空間來存儲元素,這也意味著可以采用下標對vector的元素進行訪問。
3、vector與普通數組不同的是,vector的大小是可以動態改變的。
4、當vector需要重新分配大小時,其做法是,分配一個新的數組,然后將全部元素移到這個數組當中,并釋放原來的數組空間。
5、vector分配空間策略:vector會分配一些額外的空間以適應可能的增長,因此存儲空間比實際需要的存儲空間一般更大。不同的庫采用不同的策略權衡空間的使用和重新分配,以至于在末尾插入一個元素的時候是在常數的時間復雜度完成的。
6、由于vector采用連續的空間來存儲元素,與其他動態序列容器相比,vector在訪問元素的時候更加高效,在其末尾添加和刪除元素相對高效,而對于不在其末尾進行的刪除和插入操作效率則相對較低。
?

?

vector 的使用

1.定義方式

法一:構造一個某類型的空容器。

vector<int> v1; //構造int類型的空容器

法二:構造一個含有n個val的某類型容器。

vector<int> v2(10, 2); //構造含有10個2的int類型容器

法三:拷貝構造某類型容器的復制品

vector<int> v3(v2); //拷貝構造int類型的v2容器的復制品

法四:使用迭代器拷貝構造某一段內容。

vector<int> v4(v2.begin(), v2.end()); //使用迭代器拷貝構造v2容器的某一段內容

注意:該方式也可用于拷貝其他容器的某一段內容。

string s("hello world");
vector<char> v5(s.begin(), s.end()); //拷貝構造string對象的某一段內容

vector的空間增長問題

size和capacity

通過size函數獲取當前容器中的有效元素個數,通過capacity函數獲取當前容器的最大容量。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);cout << v.size() << endl; //獲取當前容器中的有效元素個數cout << v.capacity() << endl; //獲取當前容器的最大容量return 0;
}

reserve和resize

通過reserse函數改變容器的最大容量,resize函數改變容器中的有效元素個數。

reserve規則:
?1、當所給值大于容器當前的capacity時,將capacity擴大到該值。
?2、當所給值小于容器當前的capacity時,什么也不做。

resize規則:
?1、當所給值大于容器當前的size時,將size擴大到該值,擴大的元素為第二個所給值,若未給出,則默認為0。
?2、當所給值小于容器當前的size時,將size縮小到該值。

?

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);cout << v.size() << endl; //10cout << v.capacity() << endl; //10v.reserve(20); //改變容器的capacity為20,size不變cout << v.size() << endl; //10cout << v.capacity() << endl; //20v.resize(15); //改變容器的size為15cout << v.size() << endl; //15cout << v.capacity() << endl; //20return 0;
}

empty

通過empty函數判斷當前容器是否為空。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);cout << v.empty() << endl;return 0;
}

vector的迭代器使用

?

7a77ac3e3e1f47998aa42b93947c2af5.png

?

begin和end

通過begin函數可以得到容器中第一個元素的正向迭代器,通過end函數可以得到容器中最后一個元素的后一個位置的正向迭代器。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);//正向迭代器遍歷容器vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";it++;}cout << endl;return 0;
}

比方說這道題中,在一行中需要,排序,我們這里使用了迭代器

df7e3d7c4879424ca3b8a7dc5569d9f4.png

6cd7bb8c3dbe40dd821e0de1a7093768.png

rbegin和rend

通過rbegin函數可以得到容器中最后一個元素的反向迭代器,通過rend函數可以得到容器中第一個元素的前一個位置的反向迭代器。
反向迭代器遍歷容器:

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);//反向迭代器遍歷容器vector<int>::reverse_iterator rit = v.rbegin();while (rit != v.rend()){cout << *rit << " ";rit++;}cout << endl;return 0;
}

vector的增刪查改

?

push_back和pop_back

通過push_back函數對容器進行尾插,pop_back函數對容器進行尾刪。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v;v.push_back(1); //尾插元素1v.push_back(2); //尾插元素2v.push_back(3); //尾插元素3v.push_back(4); //尾插元素4v.pop_back(); //尾刪元素v.pop_back(); //尾刪元素v.pop_back(); //尾刪元素v.pop_back(); //尾刪元素return 0;
}

這里的應用非常廣,尤其在字符串那一塊,這里給大家整一道相關的編程題

704f114e59a4428e8ebcda0016b5df02.png

?

如果用上述我說的來解決的話

#include<bits/stdc++.h>
using namespace std;
int main()
{string s, t;cin >> s >> t;int q;cin >> q;while (q--){string s1, t1;int l1, r1, l2, r2;cin >> l1 >> r1 >> l2 >> r2;for (int i = l1-1; i <= r1-1; i++){s1.push_back(s[i]);}for (int i = l2 - 1; i <= r2-1; i++){t1.push_back(t[i]);}if (s1 > t1)cout << "erfusuer"<<endl;else if (s1 < t1){cout << "yifusuyi" << endl;}elsecout << "ove"<<endl;s1 = "";t1 = "";}return 0;
}

即可依葫蘆畫瓢解決,詳解在我之前發的字符串的編程題有解釋,若代碼看不懂可以往前看。

insert和erase

通過insert函數可以在所給迭代器位置插入一個或多個元素,通過erase函數可以刪除所給迭代器位置的元素,或刪除所給迭代器區間內的所有元素(左閉右開)。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.insert(v.begin(), 0); //在容器開頭插入0v.insert(v.begin(), 5, -1); //在容器開頭插入5個-1v.erase(v.begin()); //刪除容器中的第一個元素v.erase(v.begin(), v.begin() + 5); //刪除在該迭代器區間內的元素(左閉右開)return 0;
}

find函數:
find函數共三個參數,前兩個參數確定一個迭代器區間(左閉右開),第三個參數確定所要尋找的值。
find函數在所給迭代器區間尋找第一個匹配的元素,并返回它的迭代器,若未找到,則返回所給的第二個參數。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vector<int>::iterator pos = find(v.begin(), v.end(), 2); //獲取值為2的元素的迭代器v.insert(pos, 10); //在2的位置插入10pos = find(v.begin(), v.end(), 3); //獲取值為3的元素的迭代器v.erase(pos); //刪除3return 0;
}

注意:?find函數是在算法模塊(algorithm)當中實現的,不是vector的成員函數。

在這里再給大家介紹一個典型題

5e9f001e821442bca7c5758431652da1.png

代碼:

#include<iostream>
#include<string.h>
using namespace std;
int main()
{string s1, s2;cin >> s1 >> s2;if (s2.find(s1) != -1)//如果找到返回首位置,未找到返回-1{cout << s1 << " is substring of " << s2 << endl;}else if (s1.find(s2) != -1){cout << s2 << " is substring of " << s1 << endl;}elsecout << "No substring" << endl;return 0;
}

swap

通過swap函數可以交換兩個容器的數據空間,實現兩個容器的交換。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v1(10, 1);vector<int> v2(10, 2);v1.swap(v2); //交換v1,v2的數據空間return 0;
}

在c語言中交換兩個數我們需要設立中間變量,而在c++中可以直接通過swap函數來解決

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v1(10, 1);vector<int> v2(10, 2);v1.swap(v2); //交換v1,v2的數據空間return 0;
}

clear

清除字符串內容

#include"vector.h"
#include<iostream>
#include<vector>
using namespace std;int main()
{//dabai::test1();vector<int> arr;vector<int> s;arr.push_back(11);arr.push_back(11);arr.push_back(11);arr.push_back(11);arr.pop_back();arr.insert(arr.begin()+2, 30);arr.erase(arr.begin() + 2);//arr.resize(2);//arr.reserve(100);s.swap(arr);cout << arr.size()<< endl;cout << s.size() << endl;s.clear();cout << s.size() << endl;return 0;
}

其實也相當于 s="";

元素訪問

vector當中實現了 [ ] 操作符的重載,因此我們也可以通過“下標+[ ]”的方式對容器當中的元素進行訪問。

即你可以把他當作數組一樣使用

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 1);//使用“下標+[]”的方式遍歷容器for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;return 0;
}

我們上面說到vector是支持迭代器的,所以我們還可以用范圍for對vector容器進行遍歷。(支持迭代器就支持范圍for,因為在編譯時編譯器會自動將范圍for替換為迭代器的形式)

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 1);//范圍forfor (auto e : v){cout << e << " ";}cout << endl;return 0;
}

?

?

?

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

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

相關文章

基于物聯網的智能倉管理系統方案

基于物聯網的智能倉管理系統方案 一、項目背景 隨著企業業務的快速發展&#xff0c;傳統的人工倉庫管理方式已經無法滿足現代企業的需求。倉庫運營效率低下、貨物出入庫錯誤、庫存不準確等問題不斷涌現。因此&#xff0c;我們提出一個基于物聯網技術的智能倉管理系統方案&…

Redis 五大經典業務問題

一 緩存穿透 緩存穿透是指當請求的數據既不在緩存中也不存在于數據庫中時&#xff0c;請求會直接穿透緩存層&#xff0c;到達數據庫層。這通常是由于惡意攻擊或者程序錯誤造成的&#xff0c;比如攻擊者故意請求不存在的大量數據&#xff0c;導致緩存不命中&#xff0c;所有的請…

智能優化算法應用:基于被囊群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于被囊群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于被囊群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.被囊群算法4.實驗參數設定5.算法結果6.參考文…

Moco框架的搭建使用

一、前言   之前一直聽mock&#xff0c;也大致了解mock的作用&#xff0c;但沒有具體去了解過如何用工具或框架實現mock&#xff0c;以及也沒有考慮過落實mock&#xff0c;因為在實際的工作中&#xff0c;很少會考慮用mock。最近在學java&#xff0c;剛好了解到moco框架是用于…

城市基礎設施智慧路燈改造的特點

智慧城市建設穩步有序推進。作為智慧城市的基礎設施&#xff0c;智能照明是智慧城市的重要組成部分&#xff0c;而叁仟智慧路燈是智慧城市理念下的新產品。隨著物聯網和智能控制技術的飛速發展&#xff0c;路燈被賦予了新的任務和角色。除了使道路照明智能化和節能化外&#xf…

安全掃描五項簡介

目錄 安掃五項 1.代碼檢測 2.主機基線 nginx合規檢查 麒麟基線 3.WEB掃描 4.滲透測試 用戶枚舉漏洞 漏洞描述 修復建議 點擊劫持漏洞 漏洞描述 修復建議 XSS漏洞 漏洞描述 修復建議 3.主機漏洞 超高危漏洞 高危漏洞 中危漏洞 低危漏洞 信息漏洞 參考信息…

用電商API接口獲取拼多多的商品詳情數據

pinduoduo.item_get_app_pro-根據ID取商品詳情原數據 公共參數 API請求地址 名稱類型必須描述keyString是調用key&#xff08;必須以GET方式拼接在URL中&#xff09;secretString是調用密鑰api_nameString是API接口名稱&#xff08;包括在請求地址中&#xff09;[item_searc…

一步一步寫線程之一簡單的開始

一、多線程 多線程不管是在前面的文章分析中還是在網上還是大書籍上&#xff0c;學習C/C多線程編程是無法繞過的&#xff0c;即使使用別人封裝好的框架&#xff0c;包括使用STL的一些庫&#xff0c;如果僅僅是簡單的應用&#xff0c;可能也就過去了。不過&#xff0c;稍微復雜…

VBA_MF系列技術資料1-237

MF系列VBA技術資料 為了讓廣大學員在VBA編程中有切實可行的思路及有效的提高自己的編程技巧&#xff0c;我參考大量的資料&#xff0c;并結合自己的經驗總結了這份MF系列VBA技術綜合資料&#xff0c;而且開放源碼&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04屬于定…

[Linux] 用LNMP網站框架搭建論壇

一、nginx在其中工作原理 原理&#xff1a; php-fpm.conf是控制php-fpm守護進程 它是php.ini是一個php解析器 工作過程&#xff1a; 1.當客戶端通過域名請求訪問時&#xff0c;Nginx會找到對應的虛擬主機 2. Nginx將確定請求。 對于靜態請求&#xff0c;Nginx會自行處理…

結構體和位段

結構體&#xff1a; C語言中&#xff0c;我們之前使用的都是C語言中內置的類型&#xff0c;比如整形&#xff08;int&#xff09;、字符型&#xff08;char&#xff09;、單精度浮點型&#xff08;float&#xff09;等。但是我們知道&#xff0c;我們現實世界中&#xff0c;還…

聊聊spring.mvc.servlet.load-on-startup

序 本文主要研究一下spring.mvc.servlet.load-on-startup spring.mvc.servlet.load-on-startup org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties.java ConfigurationProperties(prefix "spring.mvc") public class WebMvcProperties {//.…

json精講

本文介紹json的規范及javascript和java對數據的交換讀取 1. json介紹1.1 json簡介1.2為什么使用 JSON&#xff1f; 2. json規范2.1基礎規范2.2 key值為-字符串、數字、布爾值2.3 key值為對象Object2.4 key值為數組2.5 json本身就是一個數組 3.javascript操作json3.1 javascript…

WPF(Windows Presentation Foundation) 的 Menu控件

WPF&#xff08;Windows Presentation Foundation&#xff09;的 Menu 是一種用于創建菜單的控件。菜單通常位于應用程序窗口的頂部&#xff0c;并提供了一組命令或選項&#xff0c;用于導航到不同的功能區域、執行特定的操作或訪問特定的功能。 Menu 控件是 WPF 中的一個容器…

2、關于使用ajax驗證繞過(實例2)

ajax原理我上一篇有寫過&#xff0c;參考&#xff1a;1、關于前端js-ajax繞過-CSDN博客 一、實例環境&#xff1a; 為手機上的某一割韭菜app 二、目的&#xff1a; 實現繞過手機驗證碼&#xff0c;找回密碼 三、工具&#xff1a; bp代理 四、驗證步驟如下&#xff1a; …

ECU安全學習網站和書籍介紹

ECU安全是指關注和保護汽車電子控制單元&#xff08;ECU&#xff09;的安全性和防護措施。ECU是現代汽車中的關鍵組件&#xff0c;它負責監控和控制車輛各種系統的運行&#xff0c;如發動機、制動、轉向等。ECU安全的重要性在于防止惡意攻擊者操控或干擾車輛的操作。 ECU安全涉…

hive自定義函數及案例

一.自定義函數 1.Hive自帶了一些函數&#xff0c;比如&#xff1a;max/min等&#xff0c;但是數量有限&#xff0c;自己可以通過自定義UDF來方便的擴展。 2.當Hive提供的內置函數無法滿足你的業務處理需要時&#xff0c;此時就可以考慮使用用戶自定義函數。 3.根據用戶自定義…

GitHub為Rust語言添加了供應鏈安全工具

GitHub的供應鏈安全特性包括咨詢數據庫、Dependabot警報和依賴關系圖現在可以用于Rust Cargo文件。 為了幫助Rust開發人員發現和防止安全漏洞&#xff0c;GitHub已經為快速增長的Rust語言提供了供應鏈安全特性套件。 這些特性包括GitHub Advisory Database&#xff0c;它已經有…

構建外賣系統:使用Django框架

在當今數字化的時代&#xff0c;外賣系統的搭建不再是什么復雜的任務。通過使用Django框架&#xff0c;我們可以迅速建立一個強大、靈活且易于擴展的外賣系統。本文將演示如何使用Django構建一個簡單的外賣系統&#xff0c;并包含一些基本的技術代碼。 步驟一&#xff1a;安裝…

shell的條件測試

shell 的條件測試 概述 條件測試是 shell 編程中非常重要的一個概念&#xff0c;它允許我們根據某個條件是否滿足&#xff0c;來選擇執行相應的任務。 條件測試的語法 shell 中的條件測試語法如下&#xff1a; [ 條件表達式 ]如果條件表達式為真&#xff0c;則返回 0&…