(转)常用算法(Algorithm)的用法介绍

2算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。

2<algorithm>是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、反转、排序、合并等等。

2<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。

2<functional>中则定义了一些模板类,用以声明函数对象。

2STL提供了大量实现算法的模版函数,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能,从而大大地提升效率

#include <algorithm>

#include <numeric>

#include <functional>

using namespace std;

2常用的查找算法:

adjacent_find()( adjacent 是邻近的意思),binary_search(),count(),

count_if(),equal_range(),find(),find_if()。

2常用的排序算法:

merge(),sort(),random_shuffle()(shuffle是洗牌的意思) ,reverse()。

2常用的拷贝和替换算法:

copy(), replace(),

replace_if(),swap()

2常用的算术和生成算法:

accumulate()( accumulate 是求和的意思),fill(),。

2常用的集合算法:

set_union(),set_intersection(),

set_difference()。

2常用的遍历算法:

for_each(), transform()( transform 是变换的意思)

2adjacent_find():   在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器。否则返回past-the-end。

例如:vecInt是用vector<int>声明的容器,现已包含1,2,2,4,5元素。

vector<int>::iteratorit=adjacent_find(vecInt.begin(),vecInt.end());

此时  *it == 2

2binary_search:   在有序序列中查找value,找到则返回true。注意:在无序序列中,不可使用。

例如:   setInt是用set<int>声明的容器,现已包含1,3,5,7,9元素。

bool bFind =binary_search(setInt.begin(),setInt.end(),5);

此时 bFind == true

2count:     利用等于操作符,把标志范围内的元素与输入值比较,返回相等的个数。

2count_if:  利用输入的函数,对标志范围内的元素进行比较操作,返回结果为true的个数。

例如:vecInt是用vector<int>声明的容器,已包含1,3,5,7,9元素,现要求求出大于等于3的元素个数

//先定义比较函数

bool GreaterThree(int iNum)

{

if(iNum>=3)

{

return true;

}

else

{

return false;

}

}

int iCount = count_if(vecIntA.begin(),vecIntA.end(), GreaterThree);

//此时iCount == 4

2equal_range:    返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。

2

2find:  利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的迭代器。

例如: vecInt是用vector<int>声明的容器,已包含1,3,5,7,9

vector<int>::iterator it =find(vecInt.begin(),vecInt.end(),5);

此时 *it == 5

2find_if:   使用输入的函数代替等于操作符执行find。返回被找到的元素的迭代器。

例如:vecInt是用vector<int>声明的容器,已包含1,3,5,3,9元素。现要找出第一个大于等于3的元素的迭代器。

vector<int>::iterator it =find_if(vecInt.begin(),vecInt.end(),GreaterThree);

此时 *it==3, *(it+1)==5,*(it+2)==3, *(it+3)==9

2常用的查找算法:

adjacent_find(),binary_search(),count(),

count_if(),equal_range(),find(),find_if()。

2常用的排序算法:

merge(),sort(),random_shuffle(),reverse()。

2常用的拷贝和替换算法:

copy(), replace(),

replace_if(),swap()

2常用的算术和生成算法:

accumulate(),fill()

2常用的集合算法:

set_union(),set_intersection(),

set_difference()。

2常用的遍历算法:

for_each(), transform()

2以下是排序和通用算法:提供元素排序策略

2merge:    合并两个有序序列,存放到另一个序列。

例如:vecIntA,vecIntB,vecIntC是用vector<int>声明的容器,vecIntA已包含1,3,5,7,9元素,vecIntB已包含2,4,6,8元素

vecIntC.resize(9);  //扩大容量

merge(vecIntA.begin(),vecIntA.end(),vecIntB.begin(),vecIntB.end(),vecIntC.begin());

此时vecIntC就存放了按顺序的1,2,3,4,5,6,7,8,9九个元素

2sort:  以默认升序的方式重新排列指定范围内的元素。若要改排序规则,可以输入比较函数。

例如:  vecInt是用vector<int>声明的容器,已包含2,1,4,3,6,5元素

sort(vecInt.begin(),vecInt.end());

此时,vecInt包含了1,2,3,4,5,6元素。

如果vector<T>,T是自定义类型,则要提供T类型的比较函数

学生类有学号跟姓名的属性,有一个存着学生对象的vector容器,要使该容器按学号升序排序。

//学生类

Class CStudent:

{

public:

CStudent(int iID, string strName)

{m_iID=iID;  m_strName=strName; }

public:

int m_iID;

string m_strName;

}

2//学号比较函数

bool Compare(const CStudent &stuA,constCStudent &stuB)

{

return(stuA.m_iID<strB.m_iID);

}

void main()

{

vector<CStudent> vecStu;

vecStu.push_back(CStudent(2,"老二"));

vecStu.push_back(CStudent(1,"老大"));

vecStu.push_back(CStudent(3,"老三"));

vecStu.push_back(CStudent(4,"老四"));

sort(vecStu.begin(),vecStu.end(),Compare);

//  此时,vecStu容器包含了按顺序的"老大对象","老二对象","老三对象","老四对象"

}

2random_shuffle:     对指定范围内的元素随机调整次序。

2reverse:   对指定范围内元素重新反序排序

2常用的查找算法:

adjacent_find(),binary_search(),count(),

count_if(),equal_range(),find(),find_if()。

2常用的排序算法:

merge(),sort(),random_shuffle(),reverse()。

2常用的拷贝和替换算法:

copy(), replace(),

replace_if(),swap()

2常用的算术和生成算法:

accumulate(),fill(),。

2常用的集合算法:

set_union(),set_intersection(),

set_difference()。

2常用的遍历算法:

for_each(), transform()

copy:  复制序列

例如:vecIntA,vecIntB是用vector<int>声明的对象,vecIntA已包含1,3,5,7,9元素。

vecIntB.resize(5);

copy(vecIntA.begin(),vecIntA.end(),vecIntB.begin());

此时vecIntB也包含了1,3,5,7,9元素

2replace_if : 将指定范围内所有操作结果为true的元素用新值替换。

用法举例:

replace_if(vecIntA.begin(),vecIntA.end(),GreaterThree,newVal)

其中 vecIntA是用vector<int>声明的容器

GreaterThree 函数的原型是 bool GreaterThree(int iNum)

swap:   交换两个容器的元素

2accumulate:  对指定范围内的元素求和,然后结果再加上一个由val指定的初始值。

2fill:   将输入值赋给标志范围内的所有元素。

讲解要点

一、容器的共通能力;

二、各个容器的使用时机;

三、常用算法(Algorithm)的用法介绍。

各个容器的使用时机

adjacent_find()

vector<int>vecInt;

vecInt.push_back(1);

vecInt.push_back(2);

vecInt.push_back(2);

vecInt.push_back(4);

vecInt.push_back(5);

vector<int>::iteratorit = adjacent_find(vecInt.begin(),vecInt.end());        //*it == 2

binary_search

set<int>setInt;

setInt.insert(3);

setInt.insert(1);

setInt.insert(7);

setInt.insert(5);

setInt.insert(9);

boolbFind = binary_search(setInt.begin(),setInt.end(),5);

count()

vector<int> vecInt;

vecInt.push_back(1);

vecInt.push_back(2);

vecInt.push_back(2);

vecInt.push_back(4);

vecInt.push_back(2);

vecInt.push_back(5);

intiCount =count(vecInt.begin(),vecInt.end(),2);      //iCount==3

count_if()

假设vector<int>vecIntA,vecIntA包含1,3,5,7,9元素

//先定义比较函数

bool GreaterThree(int iNum)

{

if(iNum>=3)

{

returntrue;

}

else

{

returnfalse;

}

}

int iCount =count_if(vecIntA.begin(),vecIntA.end(), GreaterThree);

//此时iCount == 4

find()

vector<int> vecInt;

vecInt.push_back(1);

vecInt.push_back(3);

vecInt.push_back(5);

vecInt.push_back(7);

vecInt.push_back(9);

vector<int>::iterator it =find(vecInt.begin(),vecInt.end(),5);          //*it ==5

find_if()

假设vector<int>vecIntA,vecIntA包含1,3,5,3,9元素

vector<int>::it=find_if(vecInt.begin(),vecInt.end(),GreaterThree);

此时 *it==3,*(it+1)==5,*(it+2)==3, *(it+3)==9

merge()

例如:vecIntA,vecIntB,vecIntC是用vector<int>声明的容器,vecIntA已包含1,3,5,7,9元素,vecIntB已包含2,4,6,8元素

vecIntC.resize(9);  //扩大容量

merge(vecIntA.begin(),vecIntA.end(),vecIntB.begin(),vecIntB.end(),vecIntC.begin());

此时vecIntC就存放了按顺序的1,2,3,4,5,6,7,8,9九个元素

sort()

//学生类

Class CStudent:

{

public:

CStudent(intiID, string strName)

{

m_iID=iID;

m_strName=strName;

}

public:

intm_iID;

stringm_strName;

}

//学号比较函数

bool Compare(const CStudent&stuA,constCStudent &stuB)

{

return (stuA.m_iID<strB.m_iID);

}

void main()

{

vector<CStudent>vecStu;

vecStu.push_back(CStudent(2,"老二"));

vecStu.push_back(CStudent(1,"老大"));

vecStu.push_back(CStudent(3,"老三"));

vecStu.push_back(CStudent(4,"老四"));

sort(vecStu.begin(),vecStu.end(),Compare);

//  此时,vecStu容器包含了按顺序的"老大对象","老二对象","老三对象","老四对象"

}

random_shuffle()

srand(time(0));                    //设置随机种子

vector<int>vecInt;

vecInt.push_back(1);

vecInt.push_back(3);

vecInt.push_back(5);

vecInt.push_back(7);

vecInt.push_back(9);

stringstr("UIPower");

random_shuffle(vecInt.begin(),vecInt.end());   //随机排序,结果比如:9,7,1,5,3

random_shuffle(str.begin(),str.end());           //随机排序,结果比如:"owreUIP"

reverse()

vector<int>vecInt;

vecInt.push_back(1);

vecInt.push_back(3);

vecInt.push_back(5);

vecInt.push_back(7);

vecInt.push_back(9);

reverse(vecInt.begin(),vecInt.end());         //{9,7,5,3,1}

copy()

vector<int> vecIntA;

vecIntA.push_back(1);

vecIntA.push_back(3);

vecIntA.push_back(5);

vecIntA.push_back(7);

vecIntA.push_back(9);

vector<int>vecIntB;

vecIntB.resize(5);                //扩大空间

copy(vecIntA.begin(),vecIntA.end(), vecIntB.begin());    //vecIntB:{1,3,5,7,9}

replace()

vector<int>vecIntA;

vecIntA.push_back(1);

vecIntA.push_back(3);

vecIntA.push_back(5);

vecIntA.push_back(3);

vecIntA.push_back(9);

replace(vecIntA.begin(),vecIntA.end(), 3,8);           //{1,8,5,8,9}

replace_if()

//把大于等于3的元素替换成8

vector<int>vecIntA;

vecIntA.push_back(1);

vecIntA.push_back(3);

vecIntA.push_back(5);

vecIntA.push_back(3);

vecIntA.push_back(9);

replace_if(vecIntA.begin(),vecIntA.end(), GreaterThree,8);           //GreaterThree的定义在上面。

swap()

vector<int>vecIntA;

vecIntA.push_back(1);

vecIntA.push_back(3);

vecIntA.push_back(5);

vector<int>vecIntB;

vecIntB.push_back(2);

vecIntB.push_back(4);

swap(vecIntA,vecIntB);  //交换

accumulate()

vector<int>vecIntA;

vecIntA.push_back(1);

vecIntA.push_back(3);

vecIntA.push_back(5);

vecIntA.push_back(7);

vecIntA.push_back(9);

intiSum = accumulate(vecIntA.begin(), vecIntA.end(),100);           //iSum==125

fill()

vector<int>vecIntA;

vecIntA.push_back(1);

vecIntA.push_back(3);

vecIntA.push_back(5);

vecIntA.push_back(7);

vecIntA.push_back(9);

fill(vecIntA.begin(),vecIntA.end(),8);             //8, 8, 8,8, 8

set_union(),set_intersection(),set_difference()

vector<int> vecIntA;

vecIntA.push_back(1);

vecIntA.push_back(3);

vecIntA.push_back(5);

vecIntA.push_back(7);

vecIntA.push_back(9);

vector<int>vecIntB;

vecIntB.push_back(1);

vecIntB.push_back(3);

vecIntB.push_back(5);

vecIntB.push_back(6);

vecIntB.push_back(8);

vector<int>vecIntC;

vecIntC.resize(10);

//交集

set_union(vecIntA.begin(),vecIntA.end(), vecIntB.begin(), vecIntB.end(),vecIntC.begin());         //vecIntC :{1,3,5,6,7,8,9,0,0,0}

//并集

fill(vecIntC.begin(),vecIntC.end(),0);

set_intersection(vecIntA.begin(),vecIntA.end(), vecIntB.begin(), vecIntB.end(),vecIntC.begin());        //vecIntC:{1,3,5,0,0,0,0,0,0,0}

//差集

fill(vecIntC.begin(),vecIntC.end(),0);

set_difference(vecIntA.begin(),vecIntA.end(), vecIntB.begin(), vecIntB.end(),vecIntC.begin());                //vecIntC:{7,9,0,0,0,0,0,0,0,0}

for_each()

void show(const int &iItem)

{

cout<< iItem;

}

main()

{

intiArray[] = {0,1,2,3,4};

vector<int>vecInt(iArray,iArray+sizeof(iArray)/sizeof(iArray[0]));

for_each(vecInt.begin(),vecInt.end(), show);

//结果打印出0 1 2 3 4

}

transform()

int increase (int i)

{

returni+1;

}

main()

{

vector<int>vecIntA;

vecIntA.push_back(1);

vecIntA.push_back(3);

vecIntA.push_back(5);

vecIntA.push_back(7);

vecIntA.push_back(9);

transform(vecIntA.begin(),vecIntA.end(),vecIntA.begin(),increase);        //vecIntA : {2,4,6,8,10}

}

时间: 2024-12-23 06:29:13

(转)常用算法(Algorithm)的用法介绍的相关文章

数据结构(DataStructure)与算法(Algorithm)、STL应用

catalogue 0. 引论 1. 数据结构的概念 2. 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 2.3.1 二叉树 3. 物理结构实例 3.1 链表 3.1.1 单向线性链表 3.1.2 单向循环链表 3.1.3 双向线性链表 3.1.4 双向循环链表 3.1.5 数组链表 3.1.6 链表数组 3.1.7 二维链表 3.2 顺序存储 4. 算法 4.1 查找算法 4.2 排序算法 0. 引论 0x1: 为什么要学习数据结构 N.沃思(Niklaus  Wirth)教授提

数据结构图的常用算法总结

本人在校期间写了一个win32应用程序,用于回顾算法导论图的常用算法(图中边的权值为两个圆心的像素点的距离) 1.dijkstra算法求两点之间最短路径: 贪心算法用优先队列实现,每次选择距离起点路径和最短的顶点弹出队列,此顶点最短路径就已经确定 初始图如下 选择起点如W 选择终点如下: 显示路线: 1) 2) 3) 4) 打开数据,第一行为W距离S点距离,剩下为边的距离一遍参考 470 A <-> D 120 D <-> C 71 C <-> E 93 E <-

Python常用算法

本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算法应该具有以下七个重要的特征: ①有穷性(Fin

Python之路,Day21 - 常用算法学习

Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算

ACM中常用算法----字符串

ACM中常用算法--字符串 ACM中常用的字符串算法不多,主要有以下几种: Hash 字典树 KMP AC自动机 manacher 后缀数组 EX_KMP SAM(后缀自动机) 回文串自动机 下面来分别介绍一下: 0. Hash 字符串的hash是最简单也最常用的算法,通过某种hash函数将不同的字符串分别对应到不同的数字.进而配合其他数据结构或STL可以做到判重,统计,查询等操作. #### 字符串的hash函数: 一个很简单的hash函数代码如下: ull xp[maxn],hash[max

STL——配接器、常用算法使用

学习STL,必然会用到它里面的适配器和一些常用的算法.它们都是STL中的重要组成部分. 适配器 在STL里可以用一些容器适配得到适配器.例如其中的stack和queue就是由双端队列deque容器适配而来.其实适配器也是一种设计模式,该种模式是将一个类的接口转换成用户希望的另外一个接口.简单的说:就是需要的东西就在眼前,但却不能用或者使用不是很方便,而短时间又无法改造它,那我们就通过已存在的东西去适配它. STL中的适配器一共有三种: ①应用于容器的即容器适配器:比如stack和queue就是对

[C++ STL] 常用算法总结

1 概述 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象. 2 常用算法介绍 STL中算法大致分为四类: 非可变序列算法:指不直接修改其所操作的容器内容的算法. 可变序列算法:指可以修改它们所操作的容器内容的算法. 排序

机器学习常用算法盘点

在本文中,我将提供两种分类机器学习算法的方法.一是根据学习方式分类,二是根据类似的形式或功能分类.这两种方法都很有用,不过,本文将侧重后者,也就是根据类似的形式或功能分类.在阅读完本文以后,你将会对监督学习中最受欢迎的机器学习算法,以及它们彼此之间的关系有一个比较深刻的了解. 下面是一张算法思维导图,点击放大查看. 从学习方式分类 算法对一个问题建模的方式很多,可以基于经历.环境,或者任何我们称之为输入数据的东西.机器学习和人工智能的教科书通常会让你首先考虑算法能够采用什么方式学习.实际上,算法

MyEclipse相关用法介绍

MyEclipse相关用法介绍 ================================================================================ 编辑: Ctrl+Shift+L      显示所有快捷键 Ctrl+K        参照选中的词(Word)快速定位到下一个 Ctrl+Shift+K      参照选中的词(Word)快速定位到上一个 Ctrl+O         快速显示OutLine Ctrl+T        快速显示当前类的