日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从零开始_学_数据结构(五)——STL(map、set、list、vector)

發布時間:2025/6/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零开始_学_数据结构(五)——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(); //數組最后一個元素的引用

?

?

其他用法:

https://zh.wikipedia.org/wiki/Vector_(STL)

成員函數概觀[編輯]

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

?

?

?

?

總結

以上是生活随笔為你收集整理的从零开始_学_数据结构(五)——STL(map、set、list、vector)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。