1、算法概述
算法主要是由頭文件,和組成。
是所有STL頭文件中最大的一個,其中常用的功能涉及到比較,交換,查找, 遍歷,復制,修改,反轉,排序,合并等...
體積很小,只包括在幾個序列容器上進行的簡單運算的模板函數.包括加法乘法在序列上的一些操作。
定義了一些模板類,用以聲明函數對象
STL提供了大量實現算法的模版函數,只要我們熟悉了STL之后,許多代碼可以被大大的化簡,只需要通過調用一兩個算法模板,就可以完成所需要的功能,從而大大地提升效率。
2、算法分類
根據操作對象 :
直接改變容器的內容
將原容器的內容復制一份,修改其副本,然后傳回該副本
根據功能:
非可變序列算法 指不直接修改其所操作的容器內容的算法
計數算法 count、count_if
搜索算法 search、find、find_if、find_first_of、…
比較算法 equal、mismatch、lexicographical_compare
可變序列算法 指可以修改它們所操作的容器內容的算法
刪除算法 remove、remove_if、remove_copy、…
修改算法 for_each、transform
刪除算法 remove、remove_if、remove_copy、…、
排序算法 包括對序列進行排序和合并的算法、搜索算法以及有序序列上的集合操作
數值算法 對容器內容進行數值計算
3、常用遍歷算法
3.1for_each遍歷算法
/*
遍歷算法 遍歷容器元素
@param beg 開始迭代器
@param end 結束迭代器
@param _callback 函數回調或者函數對象
@return 函數對象
*/
for_each(iterator beg, iterator end, _callback);
使用案例:
//普通函數 void print01(int val){
cout << val << " "; }//函數對象 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綁定參數輸出
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類似,遍歷所有元素,但可對容器的元素進行修改
作用:
可以一個容器的元素,通過op,變換到另一個容器中(同一個容器中)
也可以把兩個容器的元素,通過op,變換到另一個容器中
注意:
1.如果目標與源相同,transform()就和for_each()一樣。
2.如果想以某值替換符合規則的元素,應使用replace()算法
/*
transform算法 將指定容器區間元素搬運到另一容器中
注意 : transform 不會給目標容器分配內存,所以需要我們提前分配好內存
@param beg1 源容器開始迭代器
@param end1 源容器結束迭代器
@param beg2 目標容器開始迭代器
@param _cakkback 回調函數或者函數對象
@return 返回目標容器迭代器
*/
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);
}
//目標容器
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);
}
//目標容器
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所使用的函數對象,參數是引用,沒有返回值void mysquare(int &num);
transform所使用的函數對象,參數一般不使用引用,而是還有返回值int mysquare2(int num);
舉例:
void mysquare(int &num){
num = num * num;}int mysquare2(int num) //結果的傳出,必須是通過返回值{
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;
}
更多關于智能物聯網培訓的問題,歡迎咨詢千鋒教育在線名師。千鋒教育擁有多年IT培訓服務經驗,采用全程面授高品質、高體驗培養模式,擁有國內一體化教學管理及學員服務,助力更多學員實現高薪夢想。