zoukankan      html  css  js  c++  java
  • STL算法

    算法
    算法,问题之解法也。以有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms).广义而言,我们所编写的每个程序都是一个算法,其中的每个函数也都是一个算法,毕竟它们都是用来解决或大或小的逻辑问题或数学问题。STL收录的算法经过了数学上的效能分析与证明,是极具复用价值的,包括常用的排序,查找等等。特定的算法往往搭配特定的数据结构,算法与数据结构相辅相成。算法分为:质变算法非质变算法
    质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
    非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等
    函数对象
    重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。
    注意:
    1.函数对象(仿函数)是一个类,不是一个函数。
    2.函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。分类:假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们就将这个类称为“一元仿函数”(unary functor);相反,如果重载的operator()要求获取两个参数,就将这个类称为“二元仿函数”(binary functor)。

    //函数对象是重载了函数调用符号的类
    class MyPrint{
    public:	
    	MyPrint()	
    	{		
    		m_Num = 0;	
    	}	
    	int m_Num; 
    public:	
    	void operator() (int num)	
    	{		
    		cout << num << endl;		
    		m_Num++;	
    	}
    }; 
    //函数对象
    //重载了()操作符的类实例化的对象,可以像普通函数那样调用,可以有参数 ,可以有返回值
    void test01(){	
    	MyPrint myPrint;	
    	myPrint(20); 
    }// 函数对象超出了普通函数的概念,可以保存函数的调用状态
    void test02(){	
    	MyPrint myPrint;	
    	myPrint(20);	
    	myPrint(20);	
    	myPrint(20);	
    	cout << myPrint.m_Num << endl;
    } 
    void doBusiness(MyPrint print,int num){	
    	print(num);
    } 
    //函数对象作为参数
    void test03(){	
    	//参数1:匿名函数对象	
    	doBusiness(MyPrint(),30);
    }

    总结如下:

    1、函数对象通常不定义构造函数和析构函数,所以在构造和析构时不会发生任何问题,避免了函数调用的运行时问题。
    2、函数对象超出普通函数的概念,函数对象可以有自己的状态
    3、函数对象可内联编译,性能好。用函数指针几乎不可能
    4、模版函数对象使函数对象具有通用性,这也是它的优势之一

    谓词
    谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断式。
    内建函数对象
    STL内建了一些函数对象。分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。使用内建函数对象,需要引入头文件 #include<functional>
    算法概述
    算法主要是由头文件<algorithm> <functional> <numeric>组成。<algorithm>是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等…<numeric>体积很小,只包括在几个序列容器上进行的简单运算的模板函数.<functional> 定义了一些模板类,用以声明函数对象。
    常用遍历算法

    /* 遍历算法 遍历容器元素	
    @param beg 开始迭代器	
    @param end 结束迭代器	
    @param _callback  函数回调或者函数对象	
    @return 函数对象*/
    for_each(iterator beg, iterator end, _callback);
    
    /*
    transform算法 将指定容器区间元素搬运到另一容器中	注意 : transform 不会给目标容器分配内存,所以需要我们提前分配好内存	
    @param beg1 源容器开始迭代器	
    @param end1 源容器结束迭代器	
    @param beg2 目标容器开始迭代器	
    @param _cakkback 回调函数或者函数对象	
    @return 返回目标容器迭代器
    */
    transform(iterator beg1, iterator end1, iterator beg2, _callbakc)

    常用查找算法

    /*find算法 查找元素	
    @param beg 容器开始迭代器	
    @param end 容器结束迭代器
    @param value 查找的元素	
    @return 返回查找元素的位置
    */
    find(iterator beg, iterator end, value)
    
    /*	
    find_if算法 条件查找	
    @param beg 容器开始迭代器	
    @param end 容器结束迭代器	
    @param  callback 回调函数或者谓词(返回bool类型的函数对象)	
    @return bool 查找返回true 否则false
    */
    find_if(iterator beg, iterator end, _callback); 
    
    /*adjacent_find算法 查找相邻重复元素	
    @param beg 容器开始迭代器	
    @param end 容器结束迭代器	
    @param  _callback 回调函数或者谓词(返回bool类型的函数对象)	
    @return 返回相邻元素的第一个位置的迭代器*/
    
    adjacent_find(iterator beg, iterator end, _callback);
    /*binary_search算法 二分查找法	注意: 在无序序列中不可用	
    @param beg 容器开始迭代器
    @param end 容器结束迭代器	
    @param value 查找的元素	
    @return bool 查找返回true 否则false*/
    bool binary_search(iterator beg, iterator end, value);
    
    /*count算法 统计元素出现次数	
    @param beg 容器开始迭代器	
    @param end 容器结束迭代器	
    @param  value回调函数或者谓词(返回bool类型的函数对象)
    @return int返回元素个数*/
    count(iterator beg, iterator end, value);
    
    /*count算法 统计元素出现次数	
    @param beg 容器开始迭代器	
    @param end 容器结束迭代器	
    @param  callback 回调函数或者谓词(返回bool类型的函数对象)	
    @return int返回元素个数
    */
    count_if(iterator beg, iterator end, _callback);

    常用排序算法

    /*merge算法 容器元素合并,并存储到另一容器中	
    @param beg1 容器1开始迭代器	
    @param end1 容器1结束迭代器	
    @param beg2 容器2开始迭代器	
    @param end2 容器2结束迭代器	
    @param dest  目标容器开始迭代器
    */
    merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)
    
    /*sort算法 容器元素排序	注意:两个容器必须是有序的	
    @param beg 容器1开始迭代器	
    @param end 容器1结束迭代器	
    @param _callback 回调函数或者谓词(返回bool类型的函数对象)*/
    sort(iterator beg, iterator end, _callback)
    
    /*sort算法 对指定范围内的元素随机调整次序	
    @param beg 容器开始迭代器	
    @param end 容器结束迭代器*/
    random_shuffle(iterator beg, iterator end)
    
    /*reverse算法 反转指定范围的元素	
    @param beg 容器开始迭代器
    @param end 容器结束迭代器*/
    reverse(iterator beg, iterator end)

    常用拷贝和替换算法

    /*copy算法 将容器内指定范围的元素拷贝到另一容器中	
    @param beg 容器开始迭代器
    @param end 容器结束迭代器	
    @param dest 目标起始迭代器*/
    copy(iterator beg, iterator end, iterator dest)
    
    /*replace算法 将容器内指定范围的旧元素修改为新元素	
    @param beg 容器开始迭代器	
    @param end 容器结束迭代器	
    @param oldvalue 旧元素	
    @param oldvalue 新元素*/
    replace(iterator beg, iterator end, oldvalue, newvalue)
    
    /*replace_if算法 将容器内指定范围满足条件的元素替换为新元素	
    @param beg 容器开始迭代器	
    @param end 容器结束迭代器	
    @param callback函数回调或者谓词(返回Bool类型的函数对象)	
    @param oldvalue 新元素*/
    replace_if(iterator beg, iterator end, _callback, newvalue)
    
    /*swap算法 互换两个容器的元素	
    @param c1容器1	
    @param c2容器2*/
    swap(container c1, container c2)

    常用算数生成算法

    /*accumulate算法 计算容器元素累计总和	
    @param beg 容器开始迭代器	
    @param end 容器结束迭代器	
    @param value累加值*/
    accumulate(iterator beg, iterator end, value)
    
    /*fill算法 向容器中添加元素
    @param beg 容器开始迭代器	
    @param end 容器结束迭代器	
    @param value t填充元素
    */
    fill(iterator beg, iterator end, value)

    常用集合算法

    /*set_intersection算法 求两个set集合的交集	注意:两个集合必须是有序序列	
    @param beg1 容器1开始迭代器	
    @param end1 容器1结束迭代器	
    @param beg2 容器2开始迭代器	
    @param end2 容器2结束迭代器	
    @param dest  目标容器开始迭代器	
    @return 目标容器的最后一个元素的迭代器地址*/
    set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)
    
    /*set_union算法 求两个set集合的并集	注意:两个集合必须是有序序列	
    @param beg1 容器1开始迭代器	
    @param end1 容器1结束迭代器	
    @param beg2 容器2开始迭代器	
    @param end2 容器2结束迭代器	
    @param dest  目标容器开始迭代器	
    @return 目标容器的最后一个元素的迭代器地址*/
    set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)
    
    /*set_difference算法 求两个set集合的差集	注意:两个集合必须是有序序列	
    @param beg1 容器1开始迭代器	
    @param end1 容器1结束迭代器	
    @param beg2 容器2开始迭代器	
    @param end2 容器2结束迭代器	
    @param dest  目标容器开始迭代器	
    @return 目标容器的最后一个元素的迭代器地址*/
    set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)
    别废话,拿你代码给我看。
  • 相关阅读:
    warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    Windows10+CLion+OpenCV4.5.2开发环境搭建
    Android解决部分机型WebView播放视频全屏按钮灰色无法点击、点击全屏白屏无法播放等问题
    MediaCodec.configure Picture Width(1080) or Height(2163) invalid, should N*2
    tesseract
    Caer -- a friendly API wrapper for OpenCV
    Integrating OpenCV python tool into one SKlearn MNIST example for supporting prediction
    Integrating Hub with one sklearn mnist example
    What is WSGI (Web Server Gateway Interface)?
    Hub --- 机器学习燃料(数据)的仓库
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707488.html
Copyright © 2011-2022 走看看