c++的標準模板庫(standard template library,簡稱stl)是乙個容器和演算法的類庫。容器往往包含同一型別的資料。stl中比較常用的容器是vector,set和map,比較常用的演算法有sort等。
.一. vector
1.宣告:
乙個vector類似於乙個動態的一維陣列。
vectora; //宣告乙個元素為int型別的vector a
vectota; //宣告乙個元素為mytype型別的vector a
這裡的宣告的a包含0個元素,既a.size()的值為0,但它是動態的,其大小會隨著資料的插入
和刪除改變而改變。
vectora(100, 0); //這裡宣告的是一已經個存放了100個0的整數vector
2.向量操作
常用函式:
size_t size(); // 返回vector的大小,即包含的元素個數
void pop_back(); // 刪除vector末尾的元素,vector大小相應減一
void push_back(); //用於在vector的末尾新增元素
t back(); // 返回vector末尾的元素
void clear(); // 將vector清空,vector大小變為0
其他訪問方式:
cout< 例:
int intarray[10];
vectorfirst_vector(intarray, intarray + 10);
vectorsecond_vector(first_vector.begin(),first_vector.end());
class man
vectormanlist;
man thisman;
thisman.id="2001";
thisman.name="yourname";
manlist.push_back thisman; //加入第乙個元素
thisman.id="2002";
thisman.name="myname";
manlist.push_back thisman; //加入第二個元素
manlist.clear(); //清空
3.遍歷
(1). for(vector::iterator it=a.begin(); it!=a.end();it++)
cout<<*it<
(2). for(int i=0;i
cout<
二. map
map是stl的乙個關聯容器,它提供一對一(其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性
map內部的實現自建一顆紅黑樹(一種非嚴格意義上的平衡二叉樹),這顆樹具有對資料自動排序的功能。
下面舉例說明什麼是一對一的資料對映。比如乙個班級中,每個學生的學號跟他的姓名就存在著一一對映的關係,這個模型用map可能輕易描述,
很明顯學號用int描述,姓名用字串描述(本篇文章中不用char *來描述字串,而是採用stl中string來描述),
下面給出map描述**:
1. 宣告方式:
mapmapstudent;
2. 資料的插入
在構造map容器後,我們就可以往裡面插入資料了。這裡講三種插入資料的方法:
第一種:用insert函式插入pair資料
mapmapstudent;
mapstudent.insert(pair(1, 「student_one」));
第二種:用insert函式插入value_type資料
mapmapstudent;
mapstudent.insert(map::value_type (1, 「student_one」));
第三種:用陣列方式插入資料
三. set
set是集合,set中不會包含重複的元素,這是和vector的區別。
定義:定義乙個元素為整數的集合a,可以用
seta;
基本操作:
對集合a中元素的有
插入元素:a.insert(1);
刪除元素(如果存在):a.erase(1);
判斷元素是否屬於集合:if (a.find(1) != a.end()) ...
返回集合元素的個數:a.size()
將集合清為空集:a.clear()
集合的並,交和差
set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iterator>(c,c.begin()));
set_intersection(a.begin(),a.end(),b.begin(),b.end(),insert_iterator>(c,c.begin()));
set_difference(a.begin(),a.end(),b.begin(),b.end(),insert_iterator>(c,c.begin()));
(注意在此前要將c清為空集)。
注意:很重要的一點,為了實現集合的快速運算,set的實現採用了平衡二叉樹,因此,set中的元素必須是可排序的。如果是自定義的型別,那在定義型別的同時必須給出運算子《的定義
四. sort
sort顧名思義就是排序
用法:單關鍵字:
對於vector a來說
sort(&a[0], &a[n]); //n=a.size() 將a中元素遞增排序。
多關鍵字:
我們也可以利用類pair
vector< pair> a; // 注意這裡兩個》 >中間必須有乙個空格,否則編譯器會當是運算子》
例如:int n,x,y;
cin >> n;
for(int i=0;i> x >> y;
a.push_back(make_pair(x,y)); // make_pair用於建立pair物件
}sort(&a[0], &a[n]);
注意:對於我們自己定義的類或結構,系統一般不能替我做比較運算,需要我們自己定義相應的運算子<
bool operator<(const mytype &x, const mytype &y)
list就是乙個列表
#include
using namespace std;
typedef listuserlist; //儲存使用者資訊
新增clientlist.push_back(currentuser);
刪除clientlist.remove(*removeiterator);
查詢stuserlistnode getuser(char *username) //根據使用者名稱獲取使用者資訊
throw exception("not find this user");}
區別:list封裝了鍊錶,vector封裝了陣列, list和vector得最主要的區別在於vector使用連續記憶體儲存的,他支援運算子,而list是以鍊錶形式實現的,不支援。
vector對於隨機訪問的速度很快,但是對於插入尤其是在頭部插入元素速度很慢,在尾部插入速度很快。list對於隨機訪問速度慢得多,因為可能要遍歷整個鍊錶才能做到,但是對於插入就快的多了,不需要拷貝和移動資料,只需要改變指標的指向就可以了。另外對於新新增的元素,vector有一套演算法,而list可以任意加入。
map,set屬於標準關聯容器,使用了非常高效的平衡檢索二叉樹:紅黑樹,他的插入刪除效率比其他序列容器高是因為不需要做記憶體拷貝和記憶體移動,而直接替換指向節點的指標即可。
set和vector的區別在於set不包含重複的資料。set和map的區別在於set只含有key,而map有乙個key和key所對應的value兩個元素。
map和hash_map的區別是hash_map使用了hash演算法來加快查詢過程,但是需要更多的記憶體來存放這些hash桶元素,因此可以算得上是採用空間來換取時間策略。
C 標準模板庫
map是stl的乙個關聯容器,它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值 的資料處理能力。資料的插入 includemapstudent strdent.insert pair 1,xiaoming strdent.insert pair 2...
C 命名空間,標準庫,標準模板庫
全域性空間與命名空間 我們在使用c 時,匯入標頭檔案一般有兩種形式,帶 h 和不帶 h 一般來說,不帶 h 的是c 的標準標頭檔案,帶的是c語言的,h 裡面定義的所有類以及物件都是在全域性空間裡,不帶的是在命名空間std裡面。c 要相容c的標準庫,而c的標準庫里碰巧也已經有乙個名字叫做 string...
標準模板庫( ) 介紹標準模板庫
標準模板庫就是類與函式模板的大集合。stl共有6種元件 容器,容器介面卡,迭代器,演算法,函式物件和函式介面卡。1 容器 容器是用來儲存和組織其他物件的物件。stl容器類的模板在標準標頭檔案中定義。1 序列容器是上面圖中的前三類 容器的操作 2 deque容器 非常類似vector,且支援相同的操作...