C++STL——概述

一、相關介紹

STL

  • 標準模板庫
  • 在編寫代碼的過程中有一些程序經常會被用到,而且需求特別穩定,所以C++中把這些常用的模板做了統一的規范,慢慢的就形成了STL
  • 提供三種類型的組件:?容器、迭代器和算法,它們都支持泛型程序設計標準

容器

  • 順序容器(vector、list、deque):通過元素在容器中的位置順序存儲和訪問元素
  • 關聯容器(set、map、multiset、multimap):通過鍵(Key)存儲和讀取元素
  • 容器適配器(stack、queue、priority_queue)

迭代器

  • 一種檢查容器內元素并遍歷元素的數據類型
  • 每種容器類型都定義了自己的迭代器類型
  • 包括:雙向迭代器、隨機迭代器

二、容器

【順序容器】

  • 順序容器中元素排列順序與其值無關,而僅僅由元素添加到容器里的次序決定
  • 容器內的元素類型必須至少滿足2個條件:可復制和可賦值
  • 所有的迭代器范圍都是左閉右開區間,[beg,end) 包括beg,但不包括end

標準庫定義了三種順序容器:vectorlistdeque

vector——連續存儲的元素,單向的

list——由節點組成的不連續存儲的雙向鏈表

deque——連續存儲的元素,雙向的

它們的區別在于訪問元素的方式,以及添加或刪除元素相關操作的運行代價。

如下圖:

【關聯容器】

  • 獨特之處在于支持鍵的使用
  • 支持通過鍵來高效地查找和讀取元素

標準庫定義了兩種關聯容器:set,map

set——僅含一個鍵,并有效地支持關于某個鍵是否存在的查詢

map——元素以鍵-值(key-value)對的形式組織:鍵用作元素在map中的索引,而值則表示所存儲和讀取的元素

一般來說,如果希望有效的存儲不同值的集合,那么set容器比較合適,而map容器則更適用于需要存儲(乃至修改)每個鍵所關聯值的情況。

在做某種文本處理時,可使用set保存要忽略的單詞。而字典則是map的一種很好的應用:單詞本身是鍵,而它的解釋說明則是值。

mapset類型的對象所包含的元素都具有不同的鍵,不允許同一個鍵添加第二個元素。如果一個鍵必須對應多個實例,則需要使用multimapmultiset類型。

【容器適配器】

  • 不是第一類容器
  • 沒有提供與元素的保存形式有關的真正數據結構實現
  • 適配器都是建立在某個順序容器之上的
  • 適配器不支持迭代器
  • 優點:能夠使程序員選擇一種合適的底層數據結構

STL提供了三種容器適配器:stack,queue,priority_queue。

statck——可以建立在vector,list,deque任何一種容器之上
queue——要求關聯容器提供front操作,所以只有list和deque滿足
priority_queue——要求提供隨機訪問功能 ,所有只有vector和deque滿足

  • stack類允許在底層數據結構的一端執行插入和刪除操作(先入后出)。堆棧能夠用任何順序容器實現:vector、list、deque。
  • queue類允許在底層數據結構的末尾插入元素,也允許從前面插入元素(先入先出)。隊列能夠用STL數據結構的list和deque實現,默認情況下是用deque實現的。
  • priority_queue類,能夠按照有序的方式在底層數據結構中執行插入操作,也能從底層數據結構的前面執行刪除操作。priority_queue能夠用STL的序列容器vector和deque實現。默認情況下使用vector作為底層容器的。當元素添加到priority_queue時,它們按優先級順序插入。這樣,具有最高優先級的元素,就是從priority_queue中首先被刪除的元素。通常這是利用堆排序來實現的。堆排序總是將最大值(即優先級最高的元素)放在數據結構的前面。這種數據結構稱為(heap)。

?

三、迭代器

?

一、迭代器的變化

和vector、list不同,set、map都是關聯式容器。set內部是基于紅黑樹實現的。插入和刪除操作效率較高,因為只需要修改相關指針而不用進行數據的移動。?
在進行數據刪除操作后,迭代器會不會失效呢?刪除set的數據時,實際的操作是刪除紅黑樹中的一個節點,然后相關指針做相關調整。指向其他元素的迭代器還是指向原位置,并沒有改變,所以刪除一個節點后其他迭代器不會失效。list和map也是同樣的道理。然而刪除vector中的某個元素,vector中其他迭代器會失效,因為vector是基于數組的,刪除一個元素后,后面的元素會往前移動,所以指向后面元素的迭代器會失效。?

二、迭代器的實現

迭代器是一個對象,vector的迭代器是封裝了數組下標;list、map、set的迭代器是封裝了元素節點的指針。?
還有一點,從數學層面,set的一個集合,好比一個袋子里面裝了好多個小球。但是紅黑樹是一種特殊的二叉搜索樹,set中的元素根據其值的大小在紅黑樹中有特定的位置,是不可移動的。所以,1是search操作效率會很高O(log n),2是set中元素的值不可改變。

?

【小問題】

set是基于紅黑樹實現的,那么set的迭代器begin()、end()是指向哪里的呢??
一個測試程序:

#include<iostream>
#include<set>
using namespace std;
int main(){set<int> myset;myset.insert(4);myset.insert(7);myset.insert(2);myset.insert(0);myset.insert(4);set<int>::iterator it;for(it = myset.begin(); it != myset.end(); it++){cout<< *it;   //輸出結果是:0247}
}

紅黑樹首先是二叉搜索樹,所以begin()迭代器指向紅黑樹的最左邊的節點,end()迭代器指向紅黑樹的最右邊的節點。另外這個小程序還說明了重復插入無效。

?

(1)STL中迭代器容器中都要注意的地方(vector中已經提到):
1)任何時候同時使用兩個迭代器產生的將會是一個前閉后開的區間(具體見插入和刪除的例子)
2)begin()指向的是vec中的第0個元素,而end是指向最后一個元素的后面一個位置(不是最后一個元素)
3)迭代器的時效性,如果一個迭代器所指向的內容已經被刪除,而后又使用該迭代器的話,會造成意想不到的后果

(2)list的迭代器是雙向迭代器(只能++?? --,沒有偏移功能)而不是像vector那樣的隨機迭代器(和指針幾乎一樣的所有功能)

在list中,由于其內存是非連續的,因此不能像vector那樣,用[]操作符取值,只能用迭代器。

(3)list和vector的區別,本質區別:list是鏈式存儲,vector在內存中是連續區別的,有本質區別而導致下面區別

1)list不支持隨機訪問(2)中已經說明,vector可以像數組那樣使用平[]訪問元素,而list是不可以的

2) list的插入和刪除效率很高,所以list有push_front、pop_front、sort而vector中這些操作的效率太低了,所以STL中沒有寫這些功能

與vector相比,list除了有push_back()//在尾部插入 和 insert()之外,還有push_front()//即在鏈表的頭部插入

3)list的一些特有的函數remove、reverse、unique、splice、merge功能(這些連deque中都沒有的)

轉載于:https://www.cnblogs.com/xzxl/p/7277261.html

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

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

相關文章

固態硬盤可靠性_您可以通過使用較少的總容量來提高硬盤的可靠性嗎?

固態硬盤可靠性Your computer has a massive hard drive that you significantly underuse. Would decreasing the size of the primary partition actually increase the lifespan of the drive? 您的計算機具有大量未充分使用的巨大硬盤驅動器。 減小主分區的大小是否會真正…

接收上傳的multi-file的文件(四)

構建工程 為例創建一個springmvc工程你需要spring-boot-starter-thymeleaf和 spring-boot-starter-web的起步依賴。為例能夠上傳文件在服務器&#xff0c;你需要在web.xml中加入標簽做相關的配置&#xff0c;但在sringboot 工程中&#xff0c;它已經為你自動做了&#xff0c;所…

數據庫讀寫分離 - MyBatis

2019獨角獸企業重金招聘Python工程師標準>>> 由于項目中數據量較大&#xff0c;訪問量也較高&#xff0c;故在數據庫的設計上&#xff0c;采用讀寫分離思想&#xff0c;達到性能要求&#xff01; 簡單科普一下實現讀寫分離的思路 配置及加載數據庫信息&#xff0c;即…

MySQL-03:數據表操作基本命令筆記

目錄 數據表 1、創建表 2、刪除表 3、清空表 4、修改表 5、基本數據類型 數據表 1、創建表 create table 表名(列名 類型 是否可以為空&#xff0c;列名 類型 是否可以為空 )ENGINEInnoDB DEFAULT CHARSETutf8 是否可空&#xff0c;null表示空&#xff0c;非字符串n…

java 怎么調試到第三方庫的內部,在有源碼的情況下

第一步&#xff0c; 把第三方庫加到workspace : https://stackoverflow.com/questions/370814/how-to-set-a-breakpoint-in-eclipse-in-a-third-party-library The most sure-fire way to do this (and end up with something thats actually useful) is to download the sou…

t-mobile頻段_T-Mobile再次被黑客入侵:超過200萬個帳號和地址可能泄漏

t-mobile頻段Attackers may have compromised three percent of T-Mobile’s 77 million customers on Monday, revealing personal information like addresses, phone numbers, and account numbers. 周一&#xff0c;攻擊者可能泄露了T-Mobile 7700萬客戶中的3&#xff05;&…

第二篇 第三章防火防煙分區檢查(一)

倉庫面積可以增加3倍 就是乘以4 要一定條件 : 第二篇 第三章防火防煙分區檢查&#xff08;一&#xff09; 21分鐘處 該題比較有代表性 停車庫 耐火等級允許最大面積 民用建筑防火分區 防煙分區的劃分    防火卷簾控制器的測試 防火閥 裝在通風,空調系統中 只有連在風機主管…

高斯數學

偉大的數學家高斯在9歲那年&#xff0c;用很短的時間完成了從1到100的累加。那原本是老師給學生們出的難題&#xff0c;希望他們能老老實實地待在教室里。高斯的方法很簡單&#xff0c;他發現這是50個101的求和&#xff1a;100&#xff0b;1、99&#xff0b;2、98&#xff0b;3…

Ant Design Blazor 發布 0.13.0,正式支持.NET 7!

時隔3個月&#xff0c;Ant Design Blazor 發布新功能版本 0.13.0&#xff0c;并正式支持.NET 7!大家快去訪問 antblazor.com 體驗吧&#xff01;&#x1f525; 新增 .NET 7 目標框架支持。#2810 ElderJames&#x1f525; 重構 Mentions 組件&#xff0c;修復定位和隱藏問題。#2…

gitlab 分支操作筆記\新建遠程分支\抓取遠程分支\復制遠程\刪除分支

密碼重新輸入與保存 git config --global http.emptyAuth truegit config --global credential.helper store 1.不復制遠程&#xff0c;直接新建遠程分支。&#xff08;非正規操作&#xff09; git init //初始化 git remote add origin http://****/*****/taskboard.git…

如何在Xbox One或PlayStation 4上為Skyrim特別版安裝Mods

The Elder Scrolls V: Skyrim Special Edition is now available on PlayStation 4 and Xbox One, and for the first time, “mods” are available to console gamers. Elder Scrolls V&#xff1a;Skyrim特別版現已在PlayStation 4和Xbox One上可用&#xff0c;并且首次向主…

微軟宣布:PowerBI 已經與 Office 整合,一切更簡單,變革又來了

很多人認為 Office 是 Office&#xff0c;PowerBI 是 PowerBI&#xff0c;怎么在 PPT 中顯示 PowerBI 呢&#xff1f;這種問題以后將再不會存在。微軟已經宣布&#xff0c;PowerBI 已經與 Office 深度整合&#xff0c;在未來的企業中&#xff0c;PowerBI 將與 Word&#xff0c;…

066:ORM查詢條件詳解-startswith和endswith:

ORM查詢條件詳解-startswith和endswith&#xff1a; startswith&#xff1a;判斷某個字段的值是否是以某個值開始的。大小寫敏感。示例代碼如下&#xff1a; articles1 Article.objects.filter(title__startswith"fuck") 以上代碼的意思是提取所有標題以 fuck 字符串…

前端工程師面試題匯總

HTML Doctype作用&#xff1f;嚴格模式與混雜模式如何區分&#xff1f;它們有何意義? HTML5 為什么只需要寫 <!DOCTYPE HTML>&#xff1f; 行內元素有哪些&#xff1f;塊級元素有哪些&#xff1f; 空(void)元素有那些&#xff1f; 頁面導入樣式時&#xff0c;使用lin…

MySQL-04:數據內容操作-增刪改查-基本命令筆記

1、增 insert into 表 (列名,列名...) values (值,值,值...) insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...) insert into 表 (列名,列名...) select (列名,列名...) from 表 2、刪 delete from 表 delete from 表 where id&#xff1d;1 and name&…

火狐和chrome_Firefox,Chrome和Edge都將支持WebAuthn的硬件兩因素身份驗證

火狐和chromeLogging into Gmail or Facebook could soon mean plugging in a USB device, potentially making phishing a thing of the past. 登錄Gmail或Facebook可能很快就意味著要插入USB設備&#xff0c;這可能使網絡釣魚成為過去。 That’s thanks to WebAuthn, a new o…

Could not delete .........May be locked by another process.

問題 原因&#xff1a;默認的設置是文件修改后立即發布&#xff0c;這樣的設置是在你每個保存文件時都會觸發&#xff0c;如果tomcat已經在運行&#xff0c;這樣頻繁的操作也會造成文件鎖死 解決&#xff1a; Tomcat 右鍵clean 轉載于:https://www.cnblogs.com/feiZhou/p/93…

flask的基礎1

1.python 現階段三大主流web框架Django Tornado Flask的對比 1.Django 主要特點是大而全,集成了很多組件,例如: Models Admin Form 等等, 不管你用得到用不到,反正它全都有,屬于全能型框架 2.Tornado 主要特點是原生異步非阻塞,在IO密集型應用和多任務處理上占據絕對性的優勢,屬…

python實現批量壓縮文件夾

前段時間碰到一個需要把目錄下文件夾壓縮的項目&#xff0c;但是度娘里沒找到&#xff0c;只好自己寫腳本了。 #coding:utf-8 import os filePath raw_input("請輸入路徑&#xff1a;") if filePath "":os._exit() #需要退出ds list(os.walk(filePath…

單元測試01:nunit 安裝與代碼測試

1.nunit 下載與安裝 a.下載 下載地址&#xff1a; http://nunit.org/download/ b.添加到系統環境變量 解壓下載包后&#xff0c;添加兩個路徑到環境變量&#xff0c;如&#xff1a; D:\nunitD:\nunit\nunit-console 2.建立測試項目 a.建立class project b.project 里re…