c++學(xué)習(xí)筆記之 STL 泛型設(shè)計

泛型設(shè)計的思路:

泛型設(shè)計的產(chǎn)生是為了解決 把相同的類或者模板類之間有相似的方法 函數(shù) 抽象出來

就是對算法的抽象 ? 迭代器的出現(xiàn) 是為了讓抽象后的算法能能夠訪問不同類的內(nèi)部數(shù)據(jù)

而出來的概念

函數(shù)對象可以理解為 對某一算法的進(jìn)一步限制提出要求

1.容器

(1)vector ?有點類似 動態(tài)數(shù)組

#include

#include//vector

#include//迭代器

#include//算法

#include//函數(shù)對象

using namespace std;

void main()

{

int a[] = {1,5,3,4,2};

vector v(a,a+5);//vector的構(gòu)造

// for(int i = 0;i<5;i++)

// cout<

vector::iterator itr;//聲明vector迭代器

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";//通過迭代器遍歷

cout<

cout<

cout<

//訪問分為順序訪問和隨機(jī)訪問? 不是所有的容器都有隨機(jī)訪問

cout<

v.push_back(100);//在vector尾部插入100

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";//通過迭代器遍歷

}

注意頭文件的使用

(2)stack

#include

#include

#include

#include

#include

using namespace std;

//棧先進(jìn)后出

void main()

{

int a;

stack s;

for(int i = 0;i<5;i++)

{

cin>>a;

s.push(a);//壓棧

}

cout<

//for( i = 0;i<5;i++)

// cout<

for( i = 0;i<5;i++)

s.pop();//出棧

cout<

}

(3).queue

#include

#include

#include

#include

#include

using namespace std;

//隊列先進(jìn)先出

void main()

{

int a;

queue q;

for(int i = 0;i < 5;i++)

{

cin>>a;

q.push(a);

}

cout<

cout<

for( i = 0;i < 5;i++)

{

q.pop();

}

cout<

}

(4)string

#include

#include

#include

#include

#include

using namespace std;

void main()

{

string s1 ="hello",s2("nihao");

cout<

cout<

for(int i = 0;s1[i]!=NULL;i++)

cout<

cout<

cout<

string s3 = s1 + s2;

cout<

s3 += s1;

cout<

cout<

cout<<(s1 == s2)<

cout<<(s2 != s1)<

cout<<(s3 > s1)<

cout<<(s3 < s1)<

cout<<(s1 >= s2)<= nihao 返回0

cout<<(s1 <= s2)<

}

2.迭代器

vector::iterator itr;//聲明vector迭代器

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";//通過迭代器遍歷

3.算法

#include

#include

#include

#include

#include

using namespace std;

void main()

{

int a[] = {1,5,3,4,2};

vector v(a,a+5);//vector的構(gòu)造

// for(int i = 0;i<5;i++)

// cout<

vector::iterator itr;//聲明vector迭代器

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";//通過迭代器遍歷

cout<

cout<

cout<

//訪問分為順序訪問和隨機(jī)訪問? 不是所有的容器都有隨機(jī)訪問

cout<

v.push_back(100);//在vector尾部插入100

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";//通過迭代器遍歷

cout<

sort(v.begin(),v.end());

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";

}

對 ?vector 可以 sort()

sort(v.begin(),v.end());

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";//這個默認(rèn)是從小到大排? 要它從大到小排要加函數(shù)對象

對string 也可以sort()

sort(s1.begin(),s1.end());

cout<

find方法

int *pos = find(v.begin(),v.end(),3);

if(pos == v.end())

cout<<"Not Found"<

else

cout<<"index = "<

find_if方法

int isodd(int x)

{

return x%2;

}

cout<<*(find_if(v.begin(),v.end(),isodd));//按照isodd的規(guī)則查找 ?找到第一個滿足的元素就返回了

count 和 count_if

int b = count(v.begin(),v.end(),3);

cout<

cout<

b = count_if(v.begin(),v.end(),isodd);

cout<

4.函數(shù)對象

(1)普通函數(shù)

#include

#include

#include

#include

#include

using namespace std;

int isbigger(int a,int b)

{

return (a>b);

}

void main()

{

int a[] = {1,5,3,4,2};

vector v(a,a+5);//vector的構(gòu)造

// for(int i = 0;i<5;i++)

// cout<

vector::iterator itr;//聲明vector迭代器

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";//通過迭代器遍歷

cout<

cout<

cout<

//訪問分為順序訪問和隨機(jī)訪問? 不是所有的容器都有隨機(jī)訪問

cout<

v.push_back(100);//在vector尾部插入100

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";//通過迭代器遍歷

cout<

sort(v.begin(),v.end(),isbigger);

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";

}

函數(shù)對象

int isbigger(int a,int b)

{

return (a>b);

}

調(diào)用方法

sort(v.begin(),v.end(),isbigger);

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";

(2)類

#include

#include

#include

#include

#include

using namespace std;

int isbigger(int a,int b)

{

return (a>b);

}

class Big

{

public:

int operator()(int a,int b)

{

return (a>b);

}

};

void main()

{

int a[] = {1,5,3,4,2};

vector v(a,a+5);//vector的構(gòu)造

// for(int i = 0;i<5;i++)

// cout<

vector::iterator itr;//聲明vector迭代器

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";//通過迭代器遍歷

cout<

cout<

cout<

//訪問分為順序訪問和隨機(jī)訪問? 不是所有的容器都有隨機(jī)訪問

cout<

v.push_back(100);//在vector尾部插入100

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";//通過迭代器遍歷

cout<

sort(v.begin(),v.end(),isbigger);

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";

cout<

sort(v.begin(),v.end(),Big());

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";

}

函數(shù)對象

class Big

{

public:

int operator()(int a,int b)

{

return (a>b);

}

};

調(diào)用方法

sort(v.begin(),v.end(),Big());

for(itr = v.begin();itr < v.end();itr++)

cout<<*itr<<" ";

最后用一個復(fù)數(shù)類來解決

注意 函數(shù)對象要能訪問到類的數(shù)據(jù)要用到 友元函數(shù) 或者友元類

#include

#include

#include

#include

#include

#include

#include

using namespace std;

class Complex;

ostream operator<<(ostream& out,const Complex& c);

istream& operator>>(istream& in,Complex& c);

Complex Add(const int a,const Complex &c1);

Complex Jian(const int a,const Complex &c1);

Complex Chen(const int a,const Complex &c1);

Complex Chu(const int a,const Complex &c1);

int isgreater(Complex x,Complex y);

class Complex

{

friend Complex Add(const int a,const Complex &c1);

friend Complex Jian(const int a,const Complex &c1);

friend Complex Chen(const int a,const Complex &c1);

friend Complex Chu(const int a,const Complex &c1);

public:

Complex(double r=0, double i=0) :real(r), imag(i){}

~Complex(){}

Complex operator+(const Complex& c1)const;

Complex operator-(const Complex& c1)const;

Complex operator*(const Complex& c1)const;

Complex operator/(const Complex& c1)const;

Complex operator-();

Complex operator++();

Complex operator++(int);

bool operator==(const Complex& c1)const;

bool operator!=(const Complex& c1)const;

bool operator>(const Complex& c1)const;

bool operator<(const Complex& c1)const;

friend ostream operator<<(ostream& out, const Complex& c);

friend istream& operator>>(istream& in,Complex& c);

friend int isgreater(Complex x,Complex y);

private:

double real;

double imag;

};

Complex Complex::operator+(const Complex& c1)const

{

Complex temp;

temp.real = real + c1.real;

temp.imag = imag + c1.imag;

return temp;

}

Complex Complex::operator-(const Complex& c1)const

{

Complex temp;

temp.real = real - c1.real;

temp.imag = imag - c1.imag;

return temp;

}

Complex Complex:: operator*(const Complex& c1)const{

Complex temp;

temp.real = real * c1.real;

temp.imag = imag * c1.imag;

return temp;

}

Complex Complex:: operator/(const Complex& c1)const

{

Complex temp;

temp.real = real / c1.real;

temp.imag = imag / c1.imag;

return temp;

}

Complex Add(const int a,const Complex &c1)

{

Complex temp;

temp.real = a + c1.real;

temp.imag = c1.imag;

return temp;

}

Complex Jian(const int a,const Complex &c1)

{

Complex temp;

temp.real = c1.real - a;

temp.imag = c1.imag;

return temp;

}

Complex Chen(const int a,const Complex &c1)

{

Complex temp;

temp.real = c1.real * a;

temp.imag = c1.imag;

return temp;

}

Complex Chu(const int a,const Complex &c1)

{

Complex temp;

temp.real = c1.real / a;

temp.imag = c1.imag;

return temp;

}

Complex Complex::operator-()

{

return Complex(-real, -imag);

}

Complex Complex::operator++()

{

++real;

++imag;

return Complex(real, imag);

}

Complex Complex::operator++(int)

{

Complex temp(*this);

real++;

imag++;

return temp;

}

bool Complex::operator==(const Complex& c1)const

{

return real == c1.real&&imag == c1.imag;

}

bool Complex::operator!=(const Complex& c1)const

{

return real != c1.real && imag != c1.imag;

}

bool Complex::operator>(const Complex& c1)const

{

return real > c1.real && imag > c1.imag;

}

bool Complex:: operator<(const Complex& c1)const

{

return real < c1.real && imag

}

ostream operator<<(ostream& out, const Complex& c)

{

out <

return out;

}

istream& operator>>(istream& in,Complex& c)

{

in>>c.real>>c.imag;

return in;

}

int isgreater(Complex x,Complex y)

{

return sqrt(x.real*x.real+x.imag*x.imag)>sqrt(y.real*y.real+y.imag*y.imag);

}

void main()

{

int n;

cout<<"請輸入復(fù)數(shù)個數(shù)";

cin>>n;

vector a(n);

vector::iterator itr;

for(itr = a.begin();itr

cin>>*itr;

sort(a.begin(),a.end(),isgreater);

for(itr = a.begin();itr

{

cout<<*itr<

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褐耳,一起剝皮案震驚了整個濱河市纠炮,隨后出現(xiàn)的幾起案子蛆挫,更是在濱河造成了極大的恐慌芋哭,老刑警劉巖袁辈,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挨措,死亡現(xiàn)場離奇詭異,居然都是意外死亡议纯,警方通過查閱死者的電腦和手機(jī)父款,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞻凤,“玉大人憨攒,你說我怎么就攤上這事》Р危” “怎么了浓恶?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長结笨。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么炕吸? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任伐憾,我火速辦了婚禮,結(jié)果婚禮上赫模,老公的妹妹穿的比我還像新娘树肃。我一直安慰自己,他們只是感情好瀑罗,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布胸嘴。 她就那樣靜靜地躺著,像睡著了一般斩祭。 火紅的嫁衣襯著肌膚如雪劣像。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天摧玫,我揣著相機(jī)與錄音耳奕,去河邊找鬼。 笑死诬像,一個胖子當(dāng)著我的面吹牛屋群,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坏挠,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼芍躏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了降狠?” 一聲冷哼從身側(cè)響起对竣,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喊熟,沒想到半個月后柏肪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡芥牌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年烦味,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壁拉。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡谬俄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弃理,到底是詐尸還是另有隱情溃论,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布痘昌,位于F島的核電站钥勋,受9級特大地震影響炬转,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜算灸,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一扼劈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菲驴,春花似錦荐吵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巧涧,卻和暖如春薯蝎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褒侧。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工良风, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闷供。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓烟央,卻偏偏與公主長得像,于是被迫代替她去往敵國和親歪脏。 傳聞我的和親對象是個殘疾皇子疑俭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容