STL泛型算法和绑定器

泛型算法是用模板(template)来实现的,因为泛型算法是给所有容器都使用的,所以接收的是容器的迭代器,泛型算法还可以传入不同的函数对象来更改。

泛型算法的特点:

  • 泛型算法的参数接收的都是迭代器
  • 泛型算法的参数还可以接收函数对象

常用的泛型算法:less,sort,find,find_if,binary_search,for_each

绑定器+二元函数对象=一元函数对象
bind1st:把二元函数对象的operator()(a,b)的第一个形参绑定起来
bind2nd:把二元函数对象的operator()(a,b)的第二个形参绑定起来

#include<iostream>
#include<vector>
#include<algorithm>//包含了C++ STL里面的泛型算法
#include<functional>//包含了函数对象和绑定器
using namespace std;

int main()
{
    
    
	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;

	//使用泛型算法进行排序,默认less从小到大
	sort(vec.begin(), vec.end());
	for (int v : vec)
	{
    
    
		cout << v << " ";
	}
	cout << endl;

	//使用binary_search泛型算法在有序容器中进行二分查找,O(logn)
	if (binary_search(vec.begin(), vec.end(), 21))
	{
    
    
		cout << "21存在" << endl;
	}
	//使用find泛型算法做顺序查找,O(n)
	auto it = find(vec.begin(), vec.end(), 21);
	if (it != vec.end())
	{
    
    
		cout << "21存在" << endl;
	}

	//改变sort的排序方式,传入相应的函数对象greater就可以改变容器元素排序时的比较方式
	sort(vec.begin(),vec.end(),greater<int>());
	for (int v : vec)
	{
    
    
		cout << v << " ";
	}
	cout << endl;

	//把48按序插入到vector容器当中,找第一个小于48的数字
	//find_if需要的是一个一元函数对象
	//greater a>b	less a<b
	
	// 下面三条语句等价
	//auto it2 = find_if(vec.begin(), vec.end(), bind1st(greater<int>(),48));
	//auto it2 = find_if(vec.begin(), vec.end(), bind2nd(less<int>(), 48));
	auto it2 = find_if(vec.begin(), vec.end(), [](int val)->bool {
    
    return val < 48; });

	vec.insert(it2, 48);
	for (int v : vec)
	{
    
    
		cout << v << " ";
	}
	cout << endl;

	//for_each可以遍历容器的所有元素,可以自行添加合适的函数对象对容器的元素进行过滤
	for_each(vec.begin(), vec.end(),
		[](int val)->void {
    
    
			if (val % 2 == 0)
			{
    
    
				cout << val << " ";
			};
		});
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41721746/article/details/124781109