使用STL库中提供的泛型算法需要引入:#include
泛型算法:template + 迭代器 + 函数对象;用模板实现的,接收的是容器的迭代器,还可以更改运算结果。。
特点:
1.泛型算法的参数接受的都是迭代器。
2.泛型算法的参数还可以接受函数对象。
实例1:sort
int arr[] = {12, 4, 78, 9, 21, 43, 56, 52, 42, 31};
vector<int> vec(arr, arr+sizeof(arr)/sizeof(arr[0]));
for (int v : vec)
{
cout << v << " ";
}
cout << endl;
sort(vec.begin(), vec.end());//begin——end之间元素默认小到大排序
for (int v : vec)
{
cout << v << " ";
}
cout << endl;
实例2:在上面有序的容器进行二分查找
int arr[] = {12, 4, 78, 9, 21, 43, 56, 52, 42, 31};
vector<int> vec(arr, arr+sizeof(arr)/sizeof(arr[0]));
for (int v : vec)
{
cout << v << " ";
}
cout << endl;
sort(vec.begin(), vec.end());//begin——end之间元素默认小到大排序
for (int v : vec)
{
cout << v << " ";
}
cout << endl;
if (binary_search(vec.begin(), vec.end(), 21));
{
cout << "21存在" <<endl;
}
实例3:改变sort排序方式
//传入函数对象greater,改变容器元素比较方式
sort(vec.begin(), vec.end(), greater<int>());
for (int v : vec)
{
cout << v << " ";
}
cout << endl;
测试结果:从大到小排序
实例4:for_each,将容器中所有偶数打印出来。
//for_each可以遍历容器的所有元素,可以自行添加合适的函数对象
//对容器的元素进行过滤。
for_each(vec.begin(), vec.end(),
[](int val)->void//拉姆达表达式
{
if (val %2 == 0)
{
cout << val << " ";
}
});
测试结果:
需要包含:#include
绑定器:绑定器 + 二元函数对象 = 一元函数对象。
bind1st:把二元函数对象operator()(a,b)第一个形参绑定起来,绑定为固定的值,只需要传入一个实参。
bind2nd:把二元函数对象operator()(a,b)第二个形参绑定起来,绑定为固定的值,只需要传入一个实参。
实例1:在上面排好序的容器中,将48按序插入到vector中 找第一个小于48的数字,需要的是一元函数对象。
//78 56 52 43 42 31 21 12 9 4
//find_if
//将48按序插入到vector中 找第一个小于48的数字,需要的是一元函数对象
//因此我们需要绑定器
//greater a > b less a < b
auto it2 = find_if(vec.begin(), vec.end(),
bind1st(greater<int>(), 48));
//bind2nd(less(),48);
//[](int val)->bool{return val < 48;}); 拉姆达表达式
vec.insert(it2, 48);
for (int v : vec)
{
cout << v << " ";
}
cout << endl;
测试结果:插入成功