C語言STL庫函數(shù)總結(jié)_第1頁
C語言STL庫函數(shù)總結(jié)_第2頁
C語言STL庫函數(shù)總結(jié)_第3頁
C語言STL庫函數(shù)總結(jié)_第4頁
C語言STL庫函數(shù)總結(jié)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

C++STL庫函數(shù)一.集合(set)頭文件<set>定義:由節(jié)點組成的紅黑樹,每個節(jié)點都包含著一個元素,節(jié)點之間以某種作用于元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序注:集合(set)默認按小于號排序(升序)set<int>st;set<int,less<int>>st;使用降序排列set<int,greater<int>>greater,less需要包含#include<functional>頭文件所以涉及到重載運算符<的問題將字符串存入集合,要使用C++string類,不能使用char*字符串set<string>st;定義集合時也可以采用如下方式:inta[10]={2,3,4,5,6};set<int>st(a,a+10);set的各成員函數(shù)用法(Usage):迭代器成員函數(shù)(Iterators)begin()--返回指向第一個元素的迭代器 //輸出時需要cout<<*(st.begin())<<endl;end()--返回指向最后一個元素后面的迭代器//如果想輸出最后一個元素,要使用cout<<*(--st.end())<<endl;find(…)--返回一個指向被查找到元素的迭代器 ——等價于count(…) 元素檢索:若找到,返回該鍵值迭代器的位置,否則,返回最后一個元素后面一個位置。set<int>s;set<int>::iteratorit;it=s.find(5); //查找鍵值為5的元素if(it!=s.end())cout<<*it<<endl; //找到elsecout<<"未找到"; //未找到::iterator--迭代器變量for(set<int>::iteratorit=st.begin();it!=st.end();it++)cout<<*it;::reverse_iterator--反向迭代器變量for(set<string>::reverse_iteratorit=st.rbegin();it!=st.rend();it++)cout<<*it; 或?qū)懽鳎?set<int>::reverse_iteratorrit;for(rit=s.rbegin();rit!=s.rend();rit++)cout<<*rit;rbegin()--返回指向集合中最后一個元素的反向迭代器rend()--返回指向集合中第一個元素的反向迭代器upper_bound(…)--返回大于某個值元素的迭代器 //有超范圍的可能,即指向st.end()lower_bound(…)--返回指向大于(或等于)某值的第一個元素的迭代器 //有超范圍的可能,即指向st.end()swap()--交換兩個集合變量 用法:set<int>s1,s2;s1.swap(s2);元素操作成員函數(shù)insert()--在集合中插入元素clear()--清除所有元素count(…)--返回某個值元素的個數(shù)——等價于find(…) //集合中一個元素最多出現(xiàn)一次,所以它的返回值只有0和1empty()--如果集合為空,返回trueerase(…)--刪除集合中的元素size()--集合中元素的數(shù)目沒有什么用的成員函數(shù)equal_range()--返回集合中與給定值相等的上下限的兩個迭代get_allocator()--返回集合的分配器key_comp()--返回一個用于元素間值比較的函數(shù)value_comp()--返回一個用于比較元素間的值的函數(shù)max_size()--返回集合能容納的元素的最大限值求集合的并、交、差、對稱差本代碼中使用的std::copy,ostream_iterator左右是輸出集合,等價于用迭代器*it循環(huán)輸出#include<iostream>#include<iterator>#include<set>#include<algorithm>usingnamespacestd;intmain(){set<int>eg1;eg1.insert(1);eg1.insert(100);eg1.insert(10);eg1.insert(9);//遍歷set,可以發(fā)現(xiàn)元素是有序的set<int>::iteratorset_iter=eg1.begin();cout<<"Setnamedeg1:"<<endl;for(;set_iter!=eg1.end();set_iter++)cout<<*set_iter<<"";cout<<endl;set<int>eg2;for(inti=6;i<15;i++)eg2.insert(i);cout<<"Setnamedeg2:"<<endl;for(set_iter=eg2.begin();set_iter!=eg2.end();set_iter++)cout<<*set_iter<<"";cout<<endl;//獲得兩個set的并set<int>eg3;set_union(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int>>(eg3,eg3.begin())); //注意第五個參數(shù)的形式copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout,""));cout<<endl;//獲得兩個set的交,注意進行集合操作之前要調(diào)用clear()函數(shù)清空一下集合eg3.clear();set_intersection(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int>>(eg3,eg3.begin()));copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout,""));cout<<endl;//獲得兩個set的差A-Beg3.clear();set_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int>>(eg3,eg3.begin()));copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout,""));cout<<endl;//獲得兩個set的對稱差,也就是假設(shè)兩個集合分別為A和B那么對稱差為AUB-A∩Beg3.clear();set_symmetric_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int>>(eg3,eg3.begin()));copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout,""));cout<<endl;return0;}二.映射(map)頭文件<map>定義:它是由由{鍵,值}對組成的集合,提供一對一(第一個稱為關(guān)鍵字,第二個稱為該關(guān)鍵字的值)的數(shù)據(jù)處理能力,由于這個特性,在我們處理一對一數(shù)據(jù)的時候,它可以在編程上提供快速通道。這里說下map內(nèi)部數(shù)據(jù)的組織,map內(nèi)部自建一顆紅黑樹(一種非嚴格意義上的平衡二叉樹),這顆樹具有對數(shù)據(jù)自動排序的功能,所以在map內(nèi)部所有的數(shù)據(jù)都是有序的,后邊我們會見識到有序的好處。注:map的內(nèi)部是按鍵{key}升序排列的。每個關(guān)鍵字{key}只能在map中出現(xiàn)一次。map中的元素其實就是一個pair。map的鍵不能是指針,比如int*,char*之類的,會出錯。常用的就用string了,int也行。鍵本身是不能被修改的,除非刪除。在for循環(huán)迭代期間是不能刪除元素的(只能用While循環(huán)刪除)。e.g. map<char,int>::iteratorit=st.begin();while(it!=st.end()){if(it->second>5)it++;elsest.erase(it++);}可以直接進行賦值和比較:=,>,>=,<,<=,!=等等e.g.if(mp[“a”]>mp[“b”]){…};用法(Usage):定義

(1)

map<string,int>

mp;

(2)

typedef

map<string,int>MP;

//用typedef定義

MPmp;

插入數(shù)據(jù)

(1)

mp["a"]=1;

(2)

mp.insert(map<string,int>::value_type("b",2));

(3)

mp.insert(pair<string,int>("c",3));

(4)

mp.insert(make_pair<string,int>("d",4));

查找數(shù)據(jù)和修改數(shù)據(jù)

(1)

int

i

=

mp["a"];

//查找

mp["a"]

=

5;

//修改

(2)

MP::iterator

Itr;

//迭代器變量

Itr=mp.find("b");

int

j

=

Itr->second; //查找

Itr->second

=

4;

//修改

不過注意,鍵本身是不能被修改的,除非刪除。

刪除數(shù)據(jù)

(1)

mp.erase(Itr);

(2)

mp.erase("c");

還是注意,(1)在for循環(huán)迭代期間是不能刪除元素的(只能用while循環(huán)刪除)。迭代數(shù)據(jù)

for

(Itr=mp.begin();

Itr!=mp.end();

++Itr)

{}其它方法

mp.size()

返回元素數(shù)目

mp.empty()

判斷是否為空

mp.clear()

清空所有元素

map中的值{value}可以直接進行賦值和比較:=,

>,

>=,

<,

<=,

!=

等等

map和set一樣,也有swap,rbegin,rend,upper_bound,lower_bound等成員函數(shù),不過沒有什么用,就不介紹了。

三.堆棧(stack)頭文件<stack>定義:一個先進后出的數(shù)據(jù)結(jié)構(gòu)(FILO)用法(Usage):stack<int>st; //定義一個stackst.push(a); //a為元素,將a放入棧中st.top(); //讀取棧頂元素st.pop(); //彈出棧頂元素st.empty(); //判斷棧是否為空bool型true為空st.size(); //棧內(nèi)還有多少個元素注:在使用.top()和.pop()時應(yīng)注意棧是否為空。while(!st.empty())st.pop();

四.隊列(queue)頭文件<queue>定義:一個先進先出的數(shù)據(jù)結(jié)構(gòu)(FIFO)用法(Usage):queue<int>qu; //定義一個queuequ.push(a); //a為元素,將a放入隊列中qu.front(); //讀取隊首元素qu.back(); //讀取隊尾元素qu.pop(); //彈出隊尾元素qu.empty(); //判斷隊列是否為空bool型true為空qu.size(); //隊列內(nèi)還有多少個元素注:在使用.front()和.back()和.pop()時應(yīng)注意隊列是否為空。while(!qu.empty())qu.pop();

五.優(yōu)先隊列(priority_queue)頭文件<queue>注:默認輸出時按降序排列,即堆頂(top)永遠是最大元素可以greater來改變順序,使堆頂為最小元素priority_queue<int,vector<int>,greater<int>>qu;其中,第二個參數(shù)為容器類型,第三個參數(shù)為比較函數(shù)。注意加載<functional>頭文件在使用.top()和.pop()時應(yīng)注意隊列是否為空。while(!qu.empty())qu.pop();用法(Usage):priority_queue<int>qu; //定義一個優(yōu)先隊列qu.push(a); //a為元素,將a放入隊列中qu.top(); //讀取隊頂元素qu.pop(); //彈出隊頂元素qu.empty(); //判斷隊列是否為空bool型true為空qu.size(); //隊列內(nèi)還有多少個元素注:重載運算符的問題它可以這么寫:structnode{intpriority,value;};booloperator<(noden1,noden2){returnn1.priority<n2.priority;}可以這么寫:structnode{booloperator<(noden2)const{returnprio_<n2.prio_;}intprio_,value;};還可以這么寫:structnode{friendbooloperator<(noden1,noden2){returnn1.priority<n2.priority;}intpriority,value;};

六.雙端隊列(deque)頭文件<queue>或<deque>定義:基本上與向量相同,唯一的不同是,其在序列頭部插入和刪除操作也具有常量時間復雜度。在隊列的首端和尾端都可以進行插入和刪除操作。用法(Usage):deque<int>de; //定義一個queue成員函數(shù):de.clear();de.empty();de.size();::iterator::reverse_iteratorde.begin();de.end();de.rbegin();de.rend();de.front();de.push_front();de.pop_front();de.back();de.push_back();de.pop_back();注:在使用各種成員函數(shù)時應(yīng)注意隊列是否為空。在使用.clear函數(shù)之后,隊列內(nèi)的數(shù)據(jù)不會被完全清空,front端的數(shù)據(jù)依舊存在。用de.front()函數(shù)和de.pop_front()函數(shù)時,還可以正常的讀取和彈出(pop)。所以,使用deque時要注意,多調(diào)試,防止出bug!!!

七.數(shù)對(pair)(頭文件<utiliy>)注:此頭文件可以不包含,因為在algorithm,iostream頭文件使用std命名空間時已經(jīng)聲明過了pair類。pair可以用于子函數(shù),當需要輸出返回一對數(shù)時,就可以returnpair類型的數(shù)對用法(Usage):定義變量pair<int,int>p; // 組成pair的兩個變量可以是任意類型的pair<double,int>p; // 如,int,double,string賦值(1)pair<int,int>ll(5,3);(2)pair<int,int>ll=make_pair(5,3);(3) pair<int,int>ll; ll=make_pair(5,3);(4)pair<int,int>ll; ll.first=5;ll.second=3;用于子函數(shù)pair<int,int>lo(intx,inty){returnmake_pair(x*y,2*y);}想要輸出它p.firstp.second

八.向量(vector)頭文件<vector>(此頁留空白,過后再補)

九.istringstream頭文件<sstream>用途(Usage):目前似乎只是分割字符串用的,把帶空格的字符串按空格分割成小的字符串(即單詞),用于拆分單詞排序呀,詞典呀之類的示例代碼:#include<iostream>#include<sstream>//istringstream必須包含這個頭文件#include<string>#include<stdio.h>usingnamespacestd;intmain(){stringstr;chars[505];//讀入字符串,方案一,用gets讀入,然后把char*轉(zhuǎn)化為string類!!!gets(s);str=s;//方案二,用std::getline讀入,但要注意cin讀入的速度問題!!!getline(cin,str);istringstreamflag(str);stringword;while(flag>>word){cout<<word<<endl;}}SampleInput:Thereisanapple.SampleOutput:Thereisanapple.

十.stringstream頭文件<sstream>用途(Usage):多用于字符串和數(shù)的類型轉(zhuǎn)換,其中字符串可以用string和字符串數(shù)組,但注意,輸入字符串時都可以,輸出時字符串數(shù)組只能用char*,不能用char[]。因為緩沖區(qū)輸出的是constchar*類型。(這句話先忽略,不知道怎么寫上去的,似乎可以用char[]數(shù)組呀。)示例代碼:#include<sstream>#include<iostream>usingnamespacestd;intmain(){stringstreamstream;intfirst,second;stream<<"456"; //插入字符串stream>>first; //轉(zhuǎn)換成intcout<<first<<endl;stream.clear(); //在進行多次轉(zhuǎn)換前,必須清除streamstream<<true; //插入bool值stream>>second; //提取出intcout<<second<<endl;}SampleInput:無SampleOutput:4561注:關(guān)于stream.clear()清空緩沖區(qū),實際上,如果讀入的內(nèi)容中包含\n或者endl,就已經(jīng)更新緩沖區(qū)了。緩沖區(qū)可以保存很多組數(shù)據(jù)。PS:但是不知道讀取存入緩沖區(qū)的耗時情況如何e.g.stream<<123<<"\n"<<456<<endl<<"s";while(stream>>second)cout<<second<<endl; SampleOutput:123456s十一.關(guān)于類型轉(zhuǎn)換注:可以使用atoi()函數(shù),但不能使用itoa()函數(shù)可以使用stream流來進行類型轉(zhuǎn)換(慎用,可

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論