C++:泛型算法与绑定器

文章目录

      • 一、泛型算法
      • 二、绑定器

一、泛型算法

使用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;

测试结果:插入成功
在这里插入图片描述

你可能感兴趣的:(C++)