算法基礎算法概述
算法部分主要由頭文件<alogrithm>,<numeric>,<funcatioal>組成.
<alogrithm>是所有STL頭文件中最大的一個,其中常用到的功能范圍涉及到比較交換替換便利操作復制修改反轉排序合并等等.
<numeric>體積很小,只包括幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操作
<funcatioal>定義了一些模板類,用以聲明函數對象
STL提供了大量實現算法的模板函數。只要我們熟悉了s te l之后,許多代碼可以被大大化解,只需要通過調用一兩個算法模板就可以完成所需要的功能,從而大大地提高效率
STL算法分類
STL中算法分為操作對象直接改變容器的內容,將原容器的內容復制一份,修改其副本,然后傳回該副本
功能
非可變訓練算法
指不直接修改其所操作的容器內容的算法技術
算法搜索,,算法比較,算法可變,
可變訓練算法
可以修改它們所操作的容器內容的算法
刪除算法,修改算法,排序算法.
排序算法包括對序列進行排序和合并的算法搜索算法以及有序。序列上的集合操作。
數值算法對容器內容進行數值計算
算法中函數對象和謂詞
重載函數調用操作符的a級對象常稱為函數對象。即他們是行為類似函數的對象,一個類對象表現出一個函數的特征,就是通過對象名加參數列表的方式使用一個類對象,如果沒有上下文,完全可以把它看作一個函數對待。在標準庫中,函數對象被廣泛地使用以獲得彈性標準庫中的很多算法,都可以使用函數對象或者函數來作為自定的回調行為。
一元函數對象函數參數一個。二元函數對象函數參數兩個,一元謂詞,函數對象一個函數返回值是布爾類型,可以作為一個判斷是謂詞可以使一個仿函數,也可以是一個回調函數。 二元謂詞。函數參數兩個函數返回值是布爾類型。
示例代碼
#include<IOStream>
using namespace std;
#include"vector"
#include"map"
#include"string"
#include"list"
#include"set"
#include"functional"
//函數對象
template<typename T>
class ShowElem
{
public:
ShowElem()
{
n - 0;
}
void operator()(T &t)
{
n++;
cout << t << " ";
}
void printN()
{
cout << "n:" << endl;
}
private:
int n;
};
class Isdiv
{
public:
Isdiv(const T &divisor);
{
this->divisor = divisor;
}
bool operator()(T &t)
{
return(t%divisor==0)
}
private:
T divisor;
};
void main33()
{
vector<int> v2;
for (int i = 0; i < 33; i++)
{
v2.push_back(i);
}
int a = 4;
Isdiv<int> myDiv(a);
vector<int>::iterator it;
it = find_if(v2.begin(), v2.end(), myDiv<int>(4));
if (it == v2.end())
{
cout << "容器中沒有值是4的元素" << endl;
}
else
{
cout << "第一個是被4整除的元素是:" << *it << endl;
}
}
template<typename T>
//函數模板
void FunShowElemt(T &t)
{
cout << t << endl;
}
//普通函數
void FunShowElemt(T &t)
{
cout << t << endl;
}
void main11()
{
int a = 10;
ShowElemt<int> showElemt;
showElemt(a);//仿函數
FunShowElemt<int>(a);
FunShowElemt2(a);
}
//函數對象是屬于類對象的概念,能突破函數的概念 能保持調用狀態信息
//for_each算法返回的是什么,迭代器?值?
void main22()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
for_each(v1.begin(), v1.end(), FunShowElemt<int>());//匿名函數對象
cout << endl;
for_each(v1.begin(), v1.end(), FunShowElemt2());//通過回調函數 誰使用for_each 誰去填寫回調函數的入口地址
ShowElem<int> shoow1;
for_each(v1.begin(), v1.end(), show1)//for_each算法 函數對象的傳遞 是元素的值傳遞,不是引用傳遞
showl.printN();
cout<<"通過for_each算法的返回值看調用的次數" << endl;
showl = for_each(v1.begin(), v1.end(), show1);
}
void main()
{
main11();
main22();
cout << "hello..." << endl;
system("pause");
return;
}