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() 回傳指向最末元素的下一個位置的
· list.rbegin() 回傳指向最末個元素的反向
· list.rend() 回傳指向第一個元素的前一個位置的反向
· 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;
int>::iterator pr = map.begin();
//疊代器指向開始(first)
//疊代器指向下一個
cout << pr->first
<< " : ";
//輸出key值,注意不要括号
cout << pr->second
<< endl;
//輸出值(在這裡就是int值)
map.erase(pr++);
//删除目前疊代器指向的元素,需要使用pr++,如果在這行之後使用的話,疊代器會無法使用(除非重新指派)
//此時疊代器指向的原本的第三個(目前的第二個)
//此時疊代器指向原本的第一個(目前第一個),原本第二個被删除了
map.insert(pr,{ "ww",4 });
//插入一個(插入位置是最後,第三個),當目前疊代器還指向的是第一個
//
三、vector
#include<vector>
vector<int>abc(10);
//類型為int,數量為10
abc[1] = 1;
//第二個元素指派為1
cout << abc[1] << endl;
//輸出第二個元素
vector<int>::iterator pr = abc.begin();
//疊代器指向第一個元素
cout << *pr
//輸出該元素的值
cout << abc.size()
<< endl; //數組元素數量
abc.front(); //數組第一個元素的引用
abc.back(); //數組最後一個元素的引用
其他用法:
<a target="_blank" href="https://zh.wikipedia.org/wiki/vector_(stl)">https://zh.wikipedia.org/wiki/vector_(stl)</a>
· 通路元素的方法
· 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();
//疊代器指向第一個
//指向下一個,注意,不是插入的第二個(100),而是值從小到大的第二個50
//輸出50
<< endl; //abc總共的元素個數
cout << abc.count(50)
<< endl; //輸出值50在整個abc裡面出現的次數
cout << abc.max_size()
<< endl; //abc的最大能容納的個數(很多很多),大概是int_max的1/10