標(biāo)準(zhǔn)庫沒有給每種容器添加大量功能,而是提供了一組算法。這些算法大多數(shù)都獨立于容器。很多時候我們希望對容器做其他操作,比如查找、排序等。標(biāo)準(zhǔn)庫沒有給每種容器都定義成員函數(shù)來實現(xiàn)這些操作,而是定義了一組泛型算法(generic algorithm),它們可用于不同類型的容器和不同類型的元素。
創(chuàng)新互聯(lián)企業(yè)建站,10余年網(wǎng)站建設(shè)經(jīng)驗,專注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁設(shè)計,有多年建站和網(wǎng)站代運營經(jīng)驗,設(shè)計師為客戶打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢和貼心的售后服務(wù)。對于成都網(wǎng)站設(shè)計、做網(wǎng)站中不同領(lǐng)域進行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶行業(yè)的需求,以靈動的思維在網(wǎng)頁中充分展現(xiàn),通過對客戶行業(yè)精準(zhǔn)市場調(diào)研,為客戶提供的解決方案。1、簡單概念大多數(shù)算法定義在頭文件algorithm中,還在頭文件numeric中定義了一組數(shù)值泛型算法。大多數(shù)情況下,這些算法不直接對容器進行操作,而是遍歷由兩個迭代器所指定的元素范圍來操作。
#include
#includeint main()
{vectorv;
auto result=find(v.begin(),v.end(),1);
return 0;
}
如以上代碼所示,find的前兩個參數(shù)是容器的迭代器,第三個參數(shù)是想查找的值。
在查找過程中,不需要依賴于容器所保存的元素類型。因為只要有迭代器就可以訪問元素。雖然迭代器令算法不依賴于容器,但算法依舊依賴于元素類型的操作,比如說find中會用到==運算符。
2、只讀算法有些算法只會讀取元素,而不會改變元素。find就是這樣的算法。另一個只讀算法是accumulate,定義在numeric頭文件中,用于對范圍內(nèi)的元素求和。
int sum=accumulate(v.cbegin(),v.cend(),0);
//前兩個參數(shù)指定需要求和的元素的范圍,第三個參數(shù)是和的初值。
//第三個參數(shù)的類型決定了返回值的類型
以上算法隱含了一個點:accumulate將第三個參數(shù)作為求和的起點,這說明把v中元素加到和上的操作必須是可行的,或者說v中元素能夠轉(zhuǎn)換為第三個參數(shù)的類型。比如說,上例中v中元素可以是int,double,long long或者其他可加到int上的類型。
//假設(shè)s是一個string類型的vector
string sum=accumulate(s.begin(),s.end(),string(""));//正確
sum=accumulate(s.begin(),s.end(),""); //錯誤
//因為""是字符串字面值,const char*類型,它沒有定義+運算符
注意:對于只讀不寫元素的算法,最好用cbegin()和cend()迭代器。
equal算法,只讀,用于判斷兩個序列是否保存相同的值。它比較兩個序列中對應(yīng)的每個元素,如果所有對應(yīng)元素相等,則返回true,否則返回false。
該算法中,兩個元素類型不必一樣,只要能用==運算符比較兩個元素類型就可以。
equal(seq1.cbegin(),seq1.cend(),seq2.cbegin())
//三個參數(shù),前兩個參數(shù)表示序列1的元素范圍,第三個參數(shù)表示第二個序列的首元素
//序列2的元素數(shù)目至少和序列1的一樣
3、寫算法寫算法會把新值賦予給序列中的元素。使用這些算法時,必須確保序列大小不小于算法寫入的元素數(shù)目。這些算法無法改變?nèi)萜鞯拇笮 ?br />一些算法會向指定范圍寫入元素,比如fill。
//該算法支持將指定范圍內(nèi)的元素值賦予新值
fill(v.begin(),v.end(),value);
//前兩個參數(shù)表示指定范圍,第三個參數(shù)表示想要設(shè)置的值
只要這個范圍是有效的,那么寫入操作就是安全的。
此外,算法不會檢查寫操作,可能會導(dǎo)致一些錯誤,比如fill_n。
fill_n(dest,n,val);
//fill_n把值val寫入迭代器dest指向的元素開始的n個元素
vectorvec;
fill_n(vec.begin(),vec.size(),0); //把vec中所有元素置為0
fill_n(vec.begin(),10,0);
//錯誤,vec是一個空vector,結(jié)果是未定義的
下面介紹下back_inserter。
之前fill_n會導(dǎo)致錯誤,因為容器沒有足夠空間來容納數(shù)據(jù)。我們可以使用back_inserter向容器中寫入數(shù)據(jù),它是定義在頭文件iterator中。
back_inserter接受一個指向容器的引用,返回一個與該容器綁定的插入迭代器。當(dāng)調(diào)用此迭代器賦值時,賦值運算符會調(diào)用push_back把元素添加到容器中,如下:
vectorvec;
auto it=back_inserter(vec); //通過該迭代器賦值會把元素添加到vec中
*it=42; //vec中有一個元素42
此外,還可以利用back_inserter來創(chuàng)建一個迭代器,作為算法的參數(shù)來使用,如下
vectorvec;
fill_n(back_inserter(vec),10,0);//添加了10個值為0的元素到vec中
//正確,back_inserter創(chuàng)建迭代器,可以用來把元素添加到vec中
在每步迭代中,fill_n向vec中一個元素賦值,每次都會調(diào)用push_back操作。
用copy算法可以實現(xiàn)序列元素的拷貝。
copy(begin,end,array);
//前兩個參數(shù)表示指定的輸入范圍,第三個參數(shù)表示目的序列的起始位置
//也就是說將begin到end所表示的元素拷貝到array指向的目的序列
//可以用copy實現(xiàn)內(nèi)置數(shù)組的拷貝
int a1[]={0,1,2,3,4,5,6,7,8,9};
int a2[sizeof(a1)/sizeof(*a1)];//創(chuàng)建一個與a1一樣大的數(shù)組
auto ret=copy(begin(a1),end(a1),a2);//把a1的內(nèi)容拷貝到a2
//ret指向拷貝到a2的尾元素之后的位置
//copy返回的是目的位置迭代器增加完成的值。
此外還有replace算法,它將序列中所有等于給定值的元素都改為另一個值。
replace(v.begin(),v.end(),0,42);
//前兩個參數(shù)指定輸入序列范圍,第三個參數(shù)表示要查找的值,第四個表示新的值
4、重排算法某些算法會重排容器中元素的順序,比如sort算法,它會讓輸入序列的元素變成有序的。
sort(begin(),end(),cmp);
//前兩個參數(shù)指定要排序的范圍,第三個參數(shù)可以是自己定義的比較函數(shù)
unique算法重排輸入序列,將相鄰的重復(fù)項“消除”,并返回一個指向沒有重復(fù)值范圍的末尾迭代器。
vectorwords={red,red,red,the,the,blue,slow,quick};
auto end_unique=unique(words.begin(),words.end());//words會變成以下序列
{red,the,blue,slow,quick,???,???,???}//???指代元素,不知道這些元素的值
end_unique迭代器會指向第一個問號所在位置
其中words的大小未改變,還是有10個元素。它只是覆蓋相鄰的重復(fù)元素,使得不重復(fù)元素出現(xiàn)在序列開始部分。end_unique迭代指向的元素及后面的元素依舊存在。
可以使用erase成員來實現(xiàn)真正的刪除操作。
words.erase(end_unique,word.end());//把最后三個元素全部刪除
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧