C++学习笔记(day6)(函数对象和一些算法)

    技术2022-07-11  115

    STL函数对象 概念:重载函数调用操作符的类,其对象常称为函数对象 函数对象使用重载的()时,行为类似函数调用,也叫仿函数 本质:函数对象(仿函数)是一个类,不是一个函数 函数对象的使用: 特点:函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值 函数对象超出普通函数的概念,函数对象可以有自己的状态 函数对象可以作为参数传递

    谓词 返回bool类型的仿函数称为谓词 如果operator()接收一个参数,那么叫做一元谓词 如果operator()接收两个参数,那么叫做二元谓词 举例:(一元谓词)二元谓词有2个参数,道理一样

    #include<iostream> using namespace std; #include<vector> #include<algorithm> class greaterFive { public: bool operator()(int val) { return val > 5; } }; void test01() { vector<int> v; for (int i = 0; i < 10; i++) { v.push_back(i); } vector<int>::iterator pos=find_if(v.begin(), v.end(), greaterFive()); if (pos != v.end()) { cout << "找到了比5大的数" << endl; } else { cout << "没有找到比5大的数" << endl; } } int main() { test01(); system("pause"); return 0; }

    内建函数对象 STL内建了一些函数对象 分类:算术仿函数 关系仿函数 逻辑仿函数 这些仿函数所产生的对像,用法和一般函数完全相同 使用内建函数对象,需要引入头文件#include

    算术仿函数 实现四则运算 其中negate是一元运算,其他都是二元运算 template T plus//加法仿函数 template T minus//减法仿函数 template T multiplies//乘法仿函数 template T divides//除法仿函数 template T modulus//取模仿函数 template T negate//取反仿函数

    关系仿函数 template bool equal_to//等于 template bool not_equal_to//不等于 template bool greater//大于 template bool greater_equal//大于等于 template bool less//小于 template bool less_equal//小于等于

    逻辑仿函数 template bool logical_and//逻辑与 template bool logical_or//逻辑或 template bool logical_not//逻辑非

    STL常用算法 算法主要是由头文件组成 是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、修改等等 定义了一些模板类,用以声明函数对象 体积很小,包括几个在序列上进行简单教学运算的模板函数

    常用遍历算法 for_each//遍历容器 transform//搬运容器到另一个容器中 例子:(注意搬运的时候要给新的容器设置空间大小)

    #include<iostream> using namespace std; #include<vector> #include<algorithm> class Trans { public: int operator()(int val) { return val; } }; class Feach { public: void operator()(int val) { cout << val << " "; } }; int main() { vector<int> v; for (int i = 0; i < 10; i++) { v.push_back(i); } vector<int> v2; v2.resize(v.size()); transform(v.begin(), v.end(), v2.begin(), Trans()); for_each(v2.begin(), v2.end(), Feach()); cout << endl; system("pause"); return 0; }

    常用查找算法 find//查找元素,找到返回指定元素的迭代器,找不到返回结束迭代器end(); find_if//按条件查找元素 adjacent_find//查找相邻重复元素 binary_search//二分查找法(无序不能使用,无序结果不确定) count//统计元素个数 count_if//按条件统计元素个数 使用find时,如果查找的是自定义类型,那么我们要重载==进行判断

    常用排序算法 sort//对容器内元素进行排序(可以配合关系仿函数使用) random_shuffle//洗牌 指定范围内的元素随机调整次序(可以加随机数种子) merge//容器元素合并,并存储到另一容器中(合并的容器一定要是有序的) reverse//反转指定范围的元素

    常用拷贝和替换算法 copy//容器内指定范围的元素拷贝到另一容器中 replace//将容器内指定范围的所有旧元素修改为新元素 replace_if//容器内指定范围满足条件的元素替换为新元素 swap//互换两个容器的元素

    常用算术生成算法 属于小型算法,包含头文件#include accumulate//计算容器元素累计总和(第三个元素是起始累加和) fill//向容器中添加元素

    常用集合算法 set_intersection//求2个容器的交集(有序)(新的容器的大小要取2个容器中的最小值)(返回值是最后一个元素的位置) set_union//求2个容器的并集(最大空间为2容器相加) set_difference//求2个容器的差集(最大空间为最大值) set_intersection实例:

    #include<iostream> using namespace std; #include<vector> #include<algorithm> class Feach { public: void operator()(int val) { cout << val << " "; } }; int main() { vector<int>v1; vector<int>v2; for (int i = 0; i < 10; i++) { v1.push_back(i); v2.push_back(i + 4); } vector<int>v3; v3.resize(min(v1.size(), v2.size())); vector<int>::iterator iEND=set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); for_each(v3.begin(), iEND,Feach()); system("pause"); return 0; }
    Processed: 0.013, SQL: 9