算法基础算法概述
算法部分主要由头文件<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;
}