从零开始_学_数据结构(五)——STL(map、set、list、vector)
STL容器
?
前注:
STL(標準模板庫)是一個C++的軟件庫,也是C++標準程序庫的一部分。
這些容器,應該都是STL里面的一個類。
vector封裝數組、list封裝鏈表、map和set封裝二叉樹
?
一、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
(1)set以結點的方式來存儲。
(2)插入和刪除之后,iterator可能失效。
(3)set中使用二分查找法,效率是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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目乱码 GBK转UTF-8工具
- 下一篇: 虚幻填坑004:减少starter co