1、算法概述
算法主要是由頭文件,和組成。
是所有STL頭文件中最大的一個,其中常用的功能涉及到比較,交換,查找, 遍歷,復(fù)制,修改,反轉(zhuǎn),排序,合并等...
體積很小,只包括在幾個序列容器上進(jìn)行的簡單運算的模板函數(shù).包括加法乘法在序列上的一些操作。
定義了一些模板類,用以聲明函數(shù)對象
STL提供了大量實現(xiàn)算法的模版函數(shù),只要我們熟悉了STL之后,許多代碼可以被大大的化簡,只需要通過調(diào)用一兩個算法模板,就可以完成所需要的功能,從而大大地提升效率。
2、算法分類
根據(jù)操作對象 :
直接改變?nèi)萜鞯膬?nèi)容
將原容器的內(nèi)容復(fù)制一份,修改其副本,然后傳回該副本
根據(jù)功能:
非可變序列算法 指不直接修改其所操作的容器內(nèi)容的算法
計數(shù)算法 count、count_if
搜索算法 search、find、find_if、find_first_of、…
比較算法 equal、mismatch、lexicographical_compare
可變序列算法 指可以修改它們所操作的容器內(nèi)容的算法
刪除算法 remove、remove_if、remove_copy、…
修改算法 for_each、transform
刪除算法 remove、remove_if、remove_copy、…、
排序算法 包括對序列進(jìn)行排序和合并的算法、搜索算法以及有序序列上的集合操作
數(shù)值算法 對容器內(nèi)容進(jìn)行數(shù)值計算
3、常用遍歷算法
3.1for_each遍歷算法
/*
遍歷算法 遍歷容器元素
@param beg 開始迭代器
@param end 結(jié)束迭代器
@param _callback 函數(shù)回調(diào)或者函數(shù)對象
@return 函數(shù)對象
*/
for_each(iterator beg, iterator end, _callback);
使用案例:
//普通函數(shù) void print01(int val){
cout << val << " "; }//函數(shù)對象 struct print001{
void operator()(int val)
{
cout << val << " ";
} };//for_each算法基本用法 void test01(){
vector<int> v;
for (int i = 0; i < 10;i++)
{
v.push_back(i);
}
//遍歷算法
for_each(v.begin(), v.end(), print01);
cout << endl;
for_each(v.begin(), v.end(), print001());
cout << endl;
}
struct print02{
print02()
{
mCount = 0;
}
void operator()(int val)
{
cout << val << " ";
mCount++;
}
int mCount;
};
//for_each返回值
void test02()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
print02 p = for_each(v.begin(), v.end(), print02());
cout << endl;
cout << p.mCount << endl; }struct print03 : public binary_function<int, int, void>{
void operator()(int val,int bindParam) const
{
cout << val + bindParam << " ";
}
};
//for_each綁定參數(shù)輸出
void test03(){
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for_each(v.begin(), v.end(), bind2nd(print03(),100));
}
3.2transform遍歷算法
transform: 與for_each類似,遍歷所有元素,但可對容器的元素進(jìn)行修改
作用:
可以一個容器的元素,通過op,變換到另一個容器中(同一個容器中)
也可以把兩個容器的元素,通過op,變換到另一個容器中
注意:
1.如果目標(biāo)與源相同,transform()就和for_each()一樣。
2.如果想以某值替換符合規(guī)則的元素,應(yīng)使用replace()算法
/*
transform算法 將指定容器區(qū)間元素搬運到另一容器中
注意 : transform 不會給目標(biāo)容器分配內(nèi)存,所以需要我們提前分配好內(nèi)存
@param beg1 源容器開始迭代器
@param end1 源容器結(jié)束迭代器
@param beg2 目標(biāo)容器開始迭代器
@param _cakkback 回調(diào)函數(shù)或者函數(shù)對象
@return 返回目標(biāo)容器迭代器
*/
transform(iterator beg1, iterator end1, iterator beg2, _callbakc);
使用案例:
struct transformTest01{
int operator()(int val){
return val + 100;
}};struct print01{
void operator()(int val){
cout << val << " ";
}};void test01(){
vector<int> vSource;
for (int i = 0; i < 10;i ++){
vSource.push_back(i + 1);
}
//目標(biāo)容器
vector<int> vTarget;
//給vTarget開辟空間
vTarget.resize(vSource.size());
//將vSource中的元素搬運到vTarget
vector<int>::iterator it = transform(vSource.begin(), vSource.end(),
vTarget.begin(), transformTest01());
//打印
for_each(vTarget.begin(), vTarget.end(), print01()); cout << endl;
}//將容器1和容器2中的元素相加放入到第三個容器中struct transformTest02{
int operator()(int v1,int v2){
return v1 + v2;
}};void test02(){
vector<int> vSource1;
vector<int> vSource2;
for (int i = 0; i < 10; i++){
vSource1.push_back(i + 1);
}
//目標(biāo)容器
vector<int> vTarget;
//給vTarget開辟空間
vTarget.resize(vSource1.size());
transform(vSource1.begin(), vSource1.end(),
vSource2.begin(),vTarget.begin(), transformTest02());
//打印
for_each(vTarget.begin(), vTarget.end(), print01()); cout << endl;}
4、for_each()和transform()算法比較
for_each() 速度快 不靈活
transform() 速度慢 非常靈活
for_each所使用的函數(shù)對象,參數(shù)是引用,沒有返回值void mysquare(int &num);
transform所使用的函數(shù)對象,參數(shù)一般不使用引用,而是還有返回值int mysquare2(int num);
舉例:
void mysquare(int &num){
num = num * num;}int mysquare2(int num) //結(jié)果的傳出,必須是通過返回值{
return num = num * num;}void main_foreach_pk_tranform()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
vector<int>v2 = v1;
for_each(v1.begin(), v1.end(), mysquare);
printAA(v1);
cout << endl;
transform(v2.begin(), v2.end(), v2.begin(), mysquare2);
printAA(v2);
cout << endl;
}
更多關(guān)于智能物聯(lián)網(wǎng)培訓(xùn)的問題,歡迎咨詢千鋒教育在線名師。千鋒教育擁有多年IT培訓(xùn)服務(wù)經(jīng)驗,采用全程面授高品質(zhì)、高體驗培養(yǎng)模式,擁有國內(nèi)一體化教學(xué)管理及學(xué)員服務(wù),助力更多學(xué)員實現(xiàn)高薪夢想。