C標(biāo)準(zhǔn)模板庫本部分以自學(xué)為主教學(xué)講義_第1頁
C標(biāo)準(zhǔn)模板庫本部分以自學(xué)為主教學(xué)講義_第2頁
C標(biāo)準(zhǔn)模板庫本部分以自學(xué)為主教學(xué)講義_第3頁
C標(biāo)準(zhǔn)模板庫本部分以自學(xué)為主教學(xué)講義_第4頁
C標(biāo)準(zhǔn)模板庫本部分以自學(xué)為主教學(xué)講義_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C標(biāo)準(zhǔn)模板庫本部分以自學(xué)為主教學(xué)講義2主要內(nèi)容泛型程序設(shè)計與標(biāo)準(zhǔn)模板庫有關(guān)的概念和術(shù)語C++標(biāo)準(zhǔn)模板庫中的容器迭代器標(biāo)準(zhǔn)C++庫中的算法函數(shù)對象3泛型程序設(shè)計將程序?qū)懙帽M可能通用,即:將算法從特定的數(shù)據(jù)結(jié)構(gòu)中抽象出來,成為通用的(可針對各種數(shù)據(jù)類型)C++的模板為泛型程序設(shè)計奠定了關(guān)鍵的基礎(chǔ)STL是泛型程序設(shè)計的一個范例容器(container)迭代器(iterator)算法(algorithms)函數(shù)對象(functionobject)四個最關(guān)鍵的組件4本章重點群體數(shù)據(jù)的類型多且處理復(fù)雜。不過,不是所有的程序員都要從頭開始自行設(shè)計所需要的類型及算法。StandardTemplateLibrary是已有的經(jīng)典優(yōu)秀的模板,本章的重點是如何使用現(xiàn)有的STL。重點理解本章例10-1至例10-15的所有例題,請自行學(xué)習(xí),不明白的,要求查找MSDN(考試重點):

Reference\C/C++LanguageandC++Libraries\StandardC++LibraryReference

或上網(wǎng)查找。

試卷中本章內(nèi)容均是本章的例題及布置的練習(xí)(兩道大題),5命名空間(Namespace)的引入在缺省情況下,在全局域中聲明的每個對象、函數(shù)、類型或模板都引入了一個全局實體(globalentity).在全局名字空間域引入的全局實體必須有唯一的名字。例如:函數(shù)和對象不能有相同的名字,無論它們是否在同一程序文本文件中被聲明。如果程序中使用一個庫,必須保證程序中的全局實體的名字不能與庫中的全局實體名字沖突。如果程序是由許多廠商提供的庫構(gòu)成,則很難保證各種庫會將許多名字引入到全局字空間域中。在組合不同廠商的庫時,就怎樣才能確保程序中的全局實體不會與這些庫中聲明的全局實體名沖突?名字沖突問題也被稱為:全局名字空間污染(globalnamespacepollution)程序員可以通過使用全局實體名字很長或在名字前加特殊的字符序列前綴,從而避免這些問題,但這樣是個累贅。而名字空間正是解決此類問題而引入的一種機制。6命名空間(Namespace)的引入庫的作者可定義一個名字空間,從而庫中的所有引入的實體都隱藏在該名字空間之中。如:namespacecplusplus_primer{

classmatrix{……}voidinverse(matrix&){….}}在一個名字空間中聲明的實體如:函數(shù),對象、類、類模板和類型聲明等都被稱為名字空間的成員(namespacemember)。用戶聲明的名字空間中的每個名字必須是名字空間內(nèi)的唯一實體。但不同用戶聲明的名字空間引入了不同的域,所以兩個不同的名字空間可以有相同的名字成員。如:namespaceDisneyFeatureAnimation{classmatrix{….}voidinverse(matrix&){….}}在程序中我們可以用既定修飾名來使用名字空間的成員。7命名空間(Namespace)的引入voidfunc(DisneyFeatureAnimation::Matrix&m){DisneyFeatrueAnimation::inverse(m);}voidmain(){cplusplus::Matrixm1;…..}如果:usingnamespaceDisneyFeatureAnimationvoidmain(){Matrixm1;cplusplus::Matrixm2;……..}8命名空間(Namespace)一個命名空間將不同的標(biāo)識符集合在一個命名作用域(namedscope)內(nèi)為了解決命名沖突例如,聲明一個命名空間NS:namspaceNS{classFile;voidFun();......}

則引用標(biāo)識符的方式如下,NS::Fileobj;NS::Fun();沒有聲明命名空間的標(biāo)識符都處于無名的命名空間中9可以用using來指定命名空間例如,經(jīng)過以下聲明:

usingNS::File;//或usingNS;

//在當(dāng)前作用域中就可以直接引用Fileusingnamespacestd;

命名空間std中所有標(biāo)識符都可直接引用在新的C++標(biāo)準(zhǔn)程序庫中,所有標(biāo)識符都聲明在命名空間std中,頭文件都不使用擴展名命名空間(Namespace)有關(guān)命名空間(Namespace)

詳見《C++Primer》10容器容器類是容納、包含一組元素或元素集合的對象。異類容器類與同類容器類順序容器與關(guān)聯(lián)容器七種基本容器:向量(vector)雙端隊列(deque)列表(list)集合(set)多重集合(multiset)映射(map)多重映射(multimap)11容器的接口通用容器運算符==,!=,>,>=,<,<=,=方法(函數(shù))迭代方法begin(),end(),rbegin(),rend()訪問方法size(),max_size(),swap(),empty()12適配器適配器是一種接口類為已有的類提供新的接口。目的是簡化、約束、使之安全、隱藏或者改變被修改類提供的服務(wù)集合。三種類型的適配器:容器適配器用來擴展7種基本容器,它們和順序容器相結(jié)合構(gòu)成棧、隊列和優(yōu)先隊列容器迭代器適配器函數(shù)對象適配器。13迭代器迭代器是面向?qū)ο蟀姹镜闹羔槪鼈兲峁┝嗽L問容器、序列中每個元素的方法。14算法C++標(biāo)準(zhǔn)模板庫中包括70多個算法其中包括查找算法,排序算法,消除算法,記數(shù)算法,比較算法,變換算法,置換算法和容器管理等等。這些算法的一個最重要的特性就是它們的統(tǒng)一性,并且可以廣泛用于不同的對象和內(nèi)置的數(shù)據(jù)類型。使用時必須指名模板參數(shù)。15順序容器順序容器的接口:插入方法

push_front(),push_back(),insert(),“=”刪除方法pop(),erase(),clear()迭代訪問方法使用迭代器其它順序容器訪問方法(不修改訪問方法)front(),back(),下標(biāo)[]運算符16順序容器——向量向量屬于順序容器,用于容納不定長線性序列(即線性群體),提供對序列的快速隨機訪問(也稱直接訪問)向量是動態(tài)結(jié)構(gòu),它的大小不固定,可以在程序運行時增加或減少。#include<iostream>//10_1.cpp#include<iomanip>#include<vector> usingnamespacestd;voidmain(void){

vector<int>A(10);

intn; intprimecount=0,i,j;cout<<"Enteravalue>=2asupperlimit:";cin>>n;

A[primecount++]=2; 17for(i=3;i<n;i++){if(primecount==A.size())

A.resize(primecount+10);if(i%2==0)continue;j=3;while(j<=i/2&&i%j!=0)j+=2;if(j>i/2)A[primecount++]=i;}for(i=0;i<primecount;i++)//輸出質(zhì)數(shù)

{cout<<setw(5)<<A[i];if((i+1)%10==0)cout<<endl;}cout<<endl;}18#include<iostream>#include<vector>usingnamespacestd;voidmain(){ typedefvector<int>IntArray; IntArrayarray; array.push_back(1); array.push_back(2); array.push_back(2); array.push_back(3); array.push_back(2); array.push_back(2); array.push_back(2); array.push_back(5); for(IntArray::iteratoritor=array.begin();itor!=array.end();++itor) cout<<*itor<<""; cout<<endl; for(itor=array.begin();itor!=array.end();++itor) { if(2==*itor)//刪除array數(shù)組中所有值為2的元素

array.erase(itor); } cout<<endl<<array.size()<<endl; for(itor=array.begin();itor!=array.end();++itor) cout<<*itor<<"";cout<<endl;}19順序容器——雙端隊列雙端隊列是一種放松了訪問權(quán)限的隊列。元素可以從隊列的兩端入隊和出隊,也支持通過下標(biāo)操作符“[]”進行直接訪問。重點掌握(要求同前):

P338例10-2

20順序容器——列表列表主要用于存放雙向鏈表,可以從任意一端開始遍歷。列表還提供了拼接(splicing)操作,將一個序列中的元素從插入到另一個序列中。#include<iostream>//10_3.cpp#include<list>usingnamespacestd;voidmain(void){

list<int>Link; //構(gòu)造一個用于存放整數(shù)鏈表

inti,key,item;

for(i=0;i<10;i++)//輸入10個整數(shù)依次向表頭插入

{

cin>>item;

Link.push_front(item);

}

cout<<"List:";//輸出鏈表21

list<int>::iteratorp=Link.begin();

while(p!=Link.end())//輸出各節(jié)點數(shù)據(jù)直到鏈表尾

{

cout<<*p<<"";

p++;//使P指向下一個節(jié)點

}

cout<<endl<<"請輸入一個需要刪除的整數(shù):";

cin>>key;

Link.remove(key);

cout<<"List:";//輸出鏈表

p=Link.begin(); //使P重新指向表頭

while(p!=Link.end())

{

cout<<*p<<"";

p++;//使P指向下一個節(jié)點

}}22容器適配器容器適配器是用來擴展7種基本容器的棧容器使用適配器與一種基礎(chǔ)容器相結(jié)合來實現(xiàn)隊列容器使用適配器與一種基礎(chǔ)容器相結(jié)合來實現(xiàn)的先進先出數(shù)據(jù)結(jié)構(gòu)。重點掌握(要求同前):

P341例10-4

P342例10-5

23什么是迭代器迭代器是面向?qū)ο蟀姹镜闹羔樦羔樋梢灾赶騼?nèi)存中的一個地址迭代器可以指向容器中的一個位置STL的每一個容器類模版中,都定義了一組對應(yīng)的迭代器類使用迭代器,算法函數(shù)可以訪問容器中指定位置的元素,而無需關(guān)心元素的具體類型。迭代器的類型輸入迭代器可以用來從序列中讀取數(shù)據(jù)輸出迭代器允許向序列中寫入數(shù)據(jù)前向迭代器既是輸入迭代器又是輸出迭代器,并且可以對序列進行單向的遍歷雙向迭代器與前向迭代器相似,但是在兩個方向上都可以對數(shù)據(jù)遍歷隨機訪問迭代器也是雙向迭代器,但能夠在序列中的任意兩個位置之間進行跳

溫馨提示

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

評論

0/150

提交評論