STL標準模板庫之vector

来源:https://www.cnblogs.com/jiyi-conding/archive/2019/08/15/11355521.html
-Advertisement-
Play Games

[TOC] STL提供了一組表示容器、迭代器、函數對象和演算法的模板。 + 容器是一個與數組類似的單元,可以存儲若幹個值。STL容器是同質的,即存儲的值的類型相同; + 演算法是完成特定任務(如對數組進行排序或在鏈表中查找特定值)的處方; + 迭代器能夠用來遍歷容器的對象,與能夠遍曆數組的指針類似,是廣 ...


目錄

STL提供了一組表示容器、迭代器、函數對象和演算法的模板。

  • 容器是一個與數組類似的單元,可以存儲若幹個值。STL容器是同質的,即存儲的值的類型相同;
  • 演算法是完成特定任務(如對數組進行排序或在鏈表中查找特定值)的處方;
  • 迭代器能夠用來遍歷容器的對象,與能夠遍曆數組的指針類似,是廣義指針;
  • 函數對象是類似於函數的對象,可以是類對象或函數指針(包括函數名,因為函數名被用作指針)。

STL使得能夠構造各種容器(包括數組、隊列和鏈表)和執行各種操作(包括搜索、排序和隨機排列)

接下來介紹幾種ACMer必須掌握的幾個成員

vector容器

1)什麼是vector

向量(Vector)是一個封裝了動態大小數組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對象。可以簡單的認為,向量是一個能夠存放任意類型的動態數組。

一般來說數組不能動態拓展,因此在程式運行的時候不是浪費記憶體,就是造成越界。而vector正好彌補了這個缺陷,它的特征是相當於可分配拓展的數組(動態數組),它的隨機訪問快,在中間插入和刪除慢,但在末端插入和刪除快。

2)如何定義

//頭文件必須包含:
#include<vector>
//定義一個vector,int為數組元素的數據類型,test1為動態數組名
vector<int>test1;
//定義一個元素為結構體型的vector
vector<information>test2
//定義一個迭代器
vector<int>::iterator it;

vector的初始化可以有很多種方式:

//定義10個整型元素的向量(尖括弧中為元素類型名,它可以是任何合法的數據類型),但沒有給出初值,其值是不確定的。
① vector<int> a(10);
//定義了10個整型元素的向量,且給出每個元素的初值為1
② vector<int> a(10,1); 
//用b向量來創建a向量,整體複製性賦值
③ vector<int> a(b); 
//定義了a值為b中第0個到第2個(共3個)元素
④ vector<int> a(b.begin(),b.begin+3);
//從數組中獲得初值
⑤ int b[7]={1,2,3,4,5,9,8};
  vector<int> a(b,b+7); 

3)常用的Vector函數

1、容量函數

  • 容器大小:a.size();//返回a中元素個數

  • 容器容量:a.capacity();//預分配的記憶體空間與size不同,返回a在記憶體中總共可以容納的元素個數

  • 容器判空:a.empty();//空則返回true,否則返回false

  • 更改容器大小:a.resize(num);a.resize(num,value);

a.resize(10); //將a的現有元素個數調至10個,多則刪,少則補,其值隨機
a.resize(10,2); //將a的現有元素個數調至10個,多則刪,少則補,其值為2

2、增加函數

  • 將區間[first,end)中的數據賦值給a (註意區間的開閉):a.assign(first,end)

  • a只含n個元素,且每個元素為elem:a.assign(n,elem)

a.assign(b.begin(), b.begin()+3); //b為向量,將b的0~2個元素構成的向量賦給a
a.assign(4,2);//a只含4個元素,且每個元素為2
  • 末尾添加元素:a.push_back(value) //在a的最後一個向量後插入一個元素,其值為value
  • 任意位置插入一個元素:a.insert(location,value)//在a的第location的位置插入value
  • 任意位置插入num個相同的元素:a.insert(location,num,value)//在a的第location的位置插入num個值為value的數
  • 插入另一個向量的[first,end)間的數據:a.insert(location,first,end)
//假設 a:5 7 3 1 4;b: 2 3 4 5 6 7 8
a.push_back(2);//a:5 7 3 1 4 2
a.insert(a.begin()+1,2);//a:5 2 7 3 1 4
a.insert(a.begin()+1,2,3);//a:5 3 3 7 3 1 4
a.insert(a.begin()+1,b.begin()+2,b.begin()+5);//a:5 4 5 6 7 3 1 4

3、刪除函數

  • 頭部刪除元素:a.pop_front();
  • 末尾刪除元素: a.pop_back();
  • 任意位置刪除一個元素: a.erase(location);
  • 刪除[first,end)之間的元素: a.erase(first, end);
  • 清空所有元素: a.clear();

4、迭代器

  • 開始指針:a.begin();
  • 末尾指針:a.end();//指向最後一個元素的下一個位置

5、訪問函數

  • 返回a的第一個元素:a.front();
  • 返回a的最後一個元素:a.back();
  • 下標訪問:a[1];//並不會檢查是否越界
  • at方法訪問:a.at(1);//會檢查越界,若越界則拋出out of range異常

6、其他函數及操作

  • 交換函數:a.swap(b);//b也為向量,將a中的元素和b中的元素進行整體交換
  • 比較操作:a==b;//b也為向量,向量的比較還有!=,>=,<=,>,<

7、演算法

需要包含頭文件:

#include<algorithm>
(1)sort(a.begin(),a.end()); //對a中的從a.begin()(包括它)到a.end()(不包括它)的元素進行從小到大排列
(2)reverse(a.begin(),a.end()); //對a中的從a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素為1,3,2,4,倒置後為4,2,3,1
(3)copy(a.begin(),a.end(),b.begin()+1); //把a中的從a.begin()(包括它)到a.end()(不包括它)的元素複製到b中,從b.begin()+1的位置(包括它)開始複製,覆蓋掉原有元素
(4)find(a.begin(),a.end(),10); //在a中的從a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最終頁面顯示效果為 主頁面 parent.vue 子頁面child.vue有兩種方法 第一種 第二種 這是兩個最簡單的例子 參考鏈接 https://cn.vuejs.org/v2/guide/render-function.html ...
  • 在電腦科學中,圖是一種網路結構的抽象模型,它是一組由邊連接的頂點組成。一個圖G = (V, E)由以下元素組成: V:一組頂點 E:一組邊,連接V中的頂點 下圖表示了一個圖的結構: 在介紹如何用JavaScript實現圖之前,我們先介紹一些和圖相關的術語。 如上圖所示,由一條邊連接在一起的頂點稱為 ...
  • 深入淺出一致性Hash原理 ...
  • 文章轉載自:http://www.pythonheidong.com/blog/article/3303/ 一、數據結構與演算法基礎 · 說一下幾種常見的排序演算法和分別的複雜度。 · 用Java寫一個冒泡排序演算法 · 描述一下鏈式存儲結構。 · 如何遍歷一棵二叉樹? · 倒排一個LinkedList。 ...
  • 文章轉載自:http://www.pythonheidong.com/blog/article/3009/ 熱點隨筆: · [譯]Web設計者和開發者必備的28個Chrome插件(JK_Rush)· 程式員裝B指南(查一把)· javascript 設計模式 - 文章很長,請自備瓜子,水果和眼藥水( ...
  • server服務端 bin下的文件 ftp_server.py conf下的文件 accounts.ini(這個可以在執行中創建) settings.py core下的文件 main.py server.py user_handle.py client客戶端 download文件是儲存下載的文件;u ...
  • 以使用靜態方法 啟動 Springboot 為例,啟動流程主要分為 SpringApplication 的創建和運行兩部分; 創建 1. 設置資源載入器,此處為空 2. 設置 Springboot 啟動類 3. 根據類路徑判斷 web 類型,預設為 SERVLET Spring MVC 4. 讀取每 ...
  • 續上一篇隨筆: https://www.cnblogs.com/kingstarer/p/8469016.html 《工作碰上的技術問題及處理經驗》(二) 我這人記憶力比較差,經常出現有些知識學了不久後就忘了,或者有些問題花了很多時間百度解決後,再過一段時間碰上時只有模糊印象,卻忘了具體解決方法。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...