1. 程式人生 > >從零開始_學_資料結構(五)——STL(map、set、list、vector)

從零開始_學_資料結構(五)——STL(map、set、list、vector)

STL容器

前注:

STL(標準模板庫)是一個C++的軟體庫,也是C++標準程式庫的一部分。

這些容器,應該都是STL裡面的一個類。

vector封裝陣列、list封裝連結串列、mapset封裝二叉樹

一、list

在不懂的時候,list可以理解為雙向連結串列(很像,但事實上不是)。

1)宣告一個list物件:

①包含標頭檔案list#include<list>

②宣告他:std::list<int> one; //宣告一個list物件

③需要注意,list位於std名稱空間之中,因此如果使用using namespace std,可以省略std::

2)使用

迭代器

①迭代器,在不懂的時候,可以理解為指標,指向物件。但事實上,迭代器不是指標(例如,指標可以加一個int值,但迭代器是不可以的)。

②宣告一個list類迭代器:std::list<int>::iterator pr = one.begin(); //一個迭代器,用於指向one的第一個物件

③迭代器可以使用++-- 這樣的形式;

pr++;

pr--;

++pr;

--pr;

效果是:++(指向list物件內的下一項),--(指向上一個項);

Note:假如當前迭代器已經指向最後或最初,則不能超出界限,否則會出錯(例如最後時不能+,第一個時不能-

④利用迭代器插入一個成員(有疑問)

int a = 1;

one.insert(pr, a);

//注意,根據觀察,每新增一個物件,迭代器便會自動指向下一個位置。

⑤查詢當前容器裡有多少個專案:

cout << one.size();

⑥刪除一個成員

更多的使用,參考連結:

http://www.cppblog.com/Lee7/archive/2008/04/14/47036.html

成員函式概觀[編輯]

· 迭代 (Iterator)

· list.begin()回傳指向第一個元素的 Iterator

· list.end()回傳指向最末元素的下一個位置的 Iterator

· list.rbegin()回傳指向最末個元素的反向 Iterator

· list.rend()回傳指向第一個元素的前一個位置的反向 Iterator

· Capacity/Size:

· list.empty()list內部為空,則回傳true值。

· list.size()回傳list內實際的元素個數。

· list.resize()重新分派list的長度。

· 存取元素的方法

· list.front()存取第一個元素。

· list.back()存取最末個元素。

· Modify methods

· list.push_front()增加一個新的元素在 list 的前端。

· list.pop_front()刪除 list 的第一個元素。

· list.push_back()增加一個新的元素在 list 的尾端。

· list.pop_back()刪除 list 的最末個元素。

· list.insert()- 插入一個或多個元素至 list內的任意位置。

· list.erase()- 刪除 list中一個或多個元素。

· list.clear()- 清空所有元素。

· 重新配置/重設長度

· list.reserve()- 如有必要,可改變 list的容量大小(配置更多的記憶體)。

· list.resize()- 改變 list目前持有的元素個數。

二、map

如程式碼:

#include<map>

map<char*, int> MAP; //宣告一個map

MAP["first"] = 1; //first是關鍵字key,1是值。值和key是成對出現的。可以把first理解為下標,只不過和平常的int下標不同

MAP["second"] = 2;

MAP["qqq"] = 3;

map<char*, int>::iterator pr = MAP.begin(); //迭代器指向開始(first)

pr++; //迭代器指向下一個

cout << pr->first << " : "; //輸出key值,注意不要括號

cout << pr->second << endl; //輸出值(在這裡就是int值)

MAP.erase(pr++); //刪除當前迭代器指向的元素,需要使用pr++,如果在這行之後使用的話,迭代器會無法使用(除非重新賦值)

cout << pr->first << " : "; //此時迭代器指向的原本的第三個(當前的第二個)

cout << pr->second << endl;

pr--; //此時迭代器指向原本的第一個(當前第一個),原本第二個被刪除了

MAP.insert(pr,{ "ww",4 }); //插入一個(插入位置是最後,第三個),當目前迭代器還指向的是第一個

pr++;

pr++; //

cout << pr->first << " : "; //此時迭代器指向的原本的第三個(當前的第二個)

cout << pr->second << endl;

三、vector

如程式碼:

#include<vector>

vector<int>abc(10); //型別為int,數量為10

abc[1] = 1; //第二個元素賦值為1

cout << abc[1] << endl; //輸出第二個元素

vector<int>::iterator pr = abc.begin(); //迭代器指向第一個元素

pr++;

cout << *pr << endl; //輸出該元素的值

cout << abc.size() << endl; //陣列元素數量

abc.front(); //陣列第一個元素的引用

abc.back(); //陣列最後一個元素的引用

其他用法:

成員函式概觀[編輯]

vector類是以容器(Container)模式為基準設計的,也就是說,基本上它有begin()end()size()max_size()empty()以及swap()這幾個方法。

· 訪問元素的方法

· vec[i]- 訪問索引值為 i 的元素引用。 (索引值從零起算,故第一個元素是vec[0]。)

· vec.at(i)- 訪問索引值為 i 的元素的引用,以 at() 訪問會做陣列邊界檢查,如果訪問越界將會丟擲一個例外,這是與operator[]的唯一差異。

· vec.front()- 回傳 vector 第一個元素的引用。

· vec.back()- 回傳 vector 最尾元素的引用。

· 新增或移除元素的方法

· vec.push_back()- 新增元素至 vector 的尾端,必要時會進行記憶體配置。

· vec.pop_back()- 刪除 vector 最尾端的元素。

· vec.insert()- 插入一個或多個元素至 vector 內的任意位置。

· vec.erase()- 刪除 vector 中一個或多個元素。

· vec.clear()- 清空所有元素。

· 獲取長度/容量

· vec.size()- 獲取 vector 目前持有的元素個數。

· vec.empty()- 如果 vector 內部為空,則傳回 true 值。

· vec.capacity()- 獲取 vector 目前可容納的最大元素個數。這個方法與記憶體的配置有關,它通常只會增加,不會因為元素被刪減而隨之減少。

· 重新配置/重置長度

· vec.reserve()- 如有必要,可改變 vector 的容量大小(配置更多的記憶體)。在眾多的 STL 實做,容量只能增加,不可以減少。

· vec.resize()- 改變 vector 目前持有的元素個數。

· 迭代 (Iterator)

· vec.begin()- 回傳一個Iterator,它指向 vector 第一個元素。

· vec.end()- 回傳一個Iterator,它指向 vector 最尾端元素的下一個位置(請注意:它不是最末元素)。

· vec.rbegin()- 回傳一個反向Iterator,它指向 vector 最尾端元素的。

· vec.rend()- 回傳一個Iterator,它指向 vector 的第一個元素。

四、set

1set以結點的方式來儲存。

2)插入和刪除之後,iterator可能失效。

3set中使用二分查詢法,效率是f(n)=log n;

4)常用程式碼:

#include<set>

set<int>abc; //宣告一個set物件

abc.insert(1); //插入一個

abc.insert(100); //再插入一個

abc.insert(50); //插入第三個

set<int>::iterator pr = abc.begin(); //迭代器指向第一個

pr++; //指向下一個,注意,不是插入的第二個(100),而是值從小到大的第二個50

cout << *pr << endl; //輸出50

cout << abc.size() << endl; //abc總共的元素個數

cout << abc.count(50) << endl; //輸出值50在整個abc裡面出現的次數

cout << abc.max_size() << endl; //abc的最大能容納的個數(很多很多),大概是INT_MAX的1/10

相關推薦

應用密碼開始③-密碼的數學基礎其一

html 使用 數據結構 密碼學 運行 狀態 機器 加法 加密 本文作者:i春秋簽約作家——黑照 前文筆者介紹了應用密碼學下傳統密碼、現代密碼對稱和非對稱算法的作用和簡介。傳統密碼原理簡單,筆者幾乎沒有計算,在現代密碼學裏面的非對稱加密沒有進行哪怕一位的加密計算過程因為

開始的Hadoop大資料叢集搭建,全免費VirtualBox虛擬機器Ubuntu版,學習向,超詳細---

     在公司工作了一段時間了,大資料平臺都是公司的運維人員搭建維護的,自己也想親自搭建一套,純粹為了學習和提高自己,也為了以後自己研究用。公司的環境不太適合亂來,自己的就可以隨意玩了。     寫這個也是為了記錄自己學習的過程,同時給大家提供一個參考,想要學習大資料的也

開始學習Python用於資料科學,Python比你想象的要強大!

為什麼是Python? Python是一種多用途的程式語言,廣泛應用於資料科學,被稱為本世紀最性感的工作。資料科學家通過大資料集挖掘,以獲得洞察力並做出有意義的資料驅動決策。Python是一種通用的程式語言,用於Web開發、網路建設、科學計算等領域。我們將進一步討論python中的一系列令人敬畏

開始用Python3做資料分析

​點選關注 非同步圖書,置頂公眾號每天與你分享 IT好書 技術乾貨 職場知識​​參與文末話題討論,每日贈送非同步圖書——非同步小編​歡迎來到Python資料分析的世界!如今,Python已成為資料分析和資料科學事實上的標準語言和標準平臺之一。我們將為讀者展示一張思維導圖,圖1

開始單排設計模式「簡單工廠設計模式」黑鐵 III

之路 dir width abd 依賴 多態 height ef6 tomcat 閱讀本文大概需要 2 分鐘。 本篇是設計模式系列的第二篇,雖然之前也寫過相應的文章,但是因為種種原因後來斷掉了,而且發現之前寫的內容也很渣,不夠系統。所以現在打算重寫,加上距離現在也有一段時間

開始搭建自己的VueJS2.0+ElementUI單頁面網站環境搭建

如圖所示 增刪改 type default sdn orm rain exp 名稱 原網址:https://blog.csdn.net/u012907049/article/details/72764151 前言 VueJS可以說是近些年來最火的前端框架之一,越來越多的

開始搭建linux下laravel 5.5所需環境

一個 技術 useradd color ram end php localhost aca 好的,我們已經安裝好了nginx+mysql+php了,打開[ Laravel 5.5 文檔 ] 快速入門 —— 安裝配置篇 我們看到這裏需要安裝Composer,好的,我們現在就

開始學習 ASP.NET MVC 1.0 () ViewEngine 深入解析與應用例項

《從零開始學習ASP.NET MVC 1.0》 文章導航 一.摘要 本文講解ViewEngine的作用, 並且深入解析了實現ViewEngine相關的所有介面和類, 最後演示瞭如何開發一個自定義的ViewEngine. 本系列文章已經全部更新為ASP.NET MVC 1.0版本.希望大家多多支援!

VUE 爬坑之旅-- 開始一步一步構建 VUE 單頁應用

上篇 從零開始一步一步構建 VUE 單頁應用(一) 對單頁應用做了簡單的介紹並建立了一個單頁應用的模版。這篇就先來看看這個專案的檔案結構,然後再看看要怎麼修改才能實現我們自己的頁面。 檔案結構 用官方的 vue-cli 生成的專案檔案結構如上圖所示

開始,搭建部落格系統MVC5+EF6搭建框架4下,前後檯布局實現釋出部落格以及展示。

1 @{ 2 string url = Request.Url.ToString().ToLower(); 3 } 4 @if (url.Contains("home")) 5 { 6 <aside class="col-sm-3 col-m

Android開始之一步一步教你實現聯絡人功能

在最近的專案中有這樣的一個需求,就是要實現類似聯絡人的列表,包含模糊查詢、按照A到Z拼音首字母分組排序、和收藏功能。參考了一下網上的例子,我覺得還是自己親自操刀來實現所有的功能。今天帶領大家先實現聯絡人右邊的側邊欄【A~Z】。先上一張圖: 可以看到,右邊是

開始構建支援TLS1.2的Web伺服器Linux版 配置Tomcat環境

博文目錄 下載Tomcat安裝包 在下載安裝Tomcat前,請確保已經按 (一) 配置JAVA環境 正確安裝配置好Java環境。 根據自己的需要選擇合適的安裝包,官方下載

開始構建支援TLS1.2的Web伺服器Linux版選裝-Redissrc安裝方式

博文目錄 下載Redis 從Redis官網,下載所需版本的Redis,當前最新版本為Redis 4.0.1 通過wget直接下載到伺服器: [[email pro

開始搭建Electron+Vue+Webpack專案框架,一套程式碼,同時構建客戶端web端

摘要:隨著前端技術的飛速發展,越來越多的技術領域開始被前端工程師踏足。從NodeJs問世至今,各種前端工具腳手架、服務端框架層出不窮,“全棧工程師”對於前端開發者來說,再也不只是說說而已。在NodeJs及其衍生技術高速發展的同時,Nw和Electron的問世,更是為前端發展提速不少,依稀記得哪位前輩說過,“能

【原創】開始搭建Electron+Vue+Webpack專案框架,一套程式碼,同時構建客戶端web端

導航: (一)Electron跑起來(二)從零搭建Vue全家桶+webpack專案框架(三)Electron+Vue+Webpack,聯合除錯整個專案(未完待續)(四)Electron配置潤色(未完待續)(五)預載入及自動更新(未完待續)(六)構建、釋出整個專案(包括client和web)(未完待續) 摘要:

開始__資料結構——樹的基本概念

相比之前的帖子,對其進行了增添和完善。 ps:本顏色的字型是後續新增內容 —————————————————— 參考連結: 大話資料結構.pdf http://www.cnblogs.com/yc_sunniwell/archive/2010/06/27/176623

開始__資料結構——STLmapsetlistvector

STL容器 前注: STL(標準模板庫)是一個C++的軟體庫,也是C++標準程式庫的一部分。 這些容器,應該都是STL裡面的一個類。 vector封裝陣列、list封裝連結串列、map和set封裝二叉樹 一、list 在不懂的時候,list可以理解為雙向連結串列(很像,

2017開始可視化數據分析師就業課程_數據分析師課程

數據分析2017從零開始學可視化數據分析師就業課程學習地址:http://www.xuetuwuyou.com/course/182課程出自學途無憂網:http://www.xuetuwuyou.com本課程由風舞煙老師團隊出品。分9個課程,26章,共計324課時! 第一階段、數據分析理論工具基礎篇課程一、數

開始Python【1】--資料型別及結構

一直想靜下心來、花點時間學習Python3這門火爆的高階語言,但總是事與願違,故只能擠點時間,做到每天進步一點點。從今天開始我把積累的點滴知識與大家做個分享,也歡迎感興趣的朋友指教與提議。 首先從Python的基礎資料型別和資料結構說起,資料型別主要包含三種,分別是數值型、字元型和日

JSP+Servlet+Tomcat應用開發開始_完整版附原始碼

連結:https://pan.baidu.com/s/17Lx7g3qBVierneWlJJQCjg  提取碼:0x7w  目錄  第1章搭建 Java Web開發環境  1.1 Web開發背景知識  1.1.1 Web訪問的基本原理.&nb