algorithm(算法)
algorithm(算法)
STL中算可以分为三种,
1、变序型队列算法,可以改变容器内的数据;
2、非变序型队列算法,处理容器内的数据而不改变他们 ;
3、通用数值算法,这涉及到很多专业领域的算术操作,这里不做介绍。
第一是变序型算法,这种算法可以改变容器内的数据,而且可以只对容器的一部分数据进行操作。常用的有copy,reverse,swap,replace等,用法如下:
首先看看copy函数,是将某一范围的数据拷贝到新的容器中
_OutIt copy(_InIt _First, _InIt _Last,_OutIt _Dest); // copy [_First, _Last) to [_Dest, ...)
可写如下代码实现:

int arr[6] = {1,12,3,2,1215,90};
int arr1[7];
copy(arr,arr+6,arr1);//(0-5)将arr中前六个数据拷贝到arr1中
cout<<"将arr[6]copy到arr[1]:"<<endl;
for (int i = 0;i < 6;i ++)
{
cout<<arr1[i]<<" ";
}

接下来看reverse函数,将容器中数据反转
void reverse(_BidIt _First, _BidIt _Last);// reverse elements in [_First, _Last)
看代码如何实现:
reverse(arr,arr+6);//将arr中前六个数据反转,
cout<<"\n将arr数据反转:"<<endl;
for (int i = 0;i < 6;i ++)
{
cout<<arr[i]<<" ";
}
现在看swap,swap_range函数,交换两个空间大小相同的容器的数据
_FwdIt2 swap_ranges(_FwdIt1 _First1, _FwdIt1 _Last1,
_FwdIt2 _Dest);// swap [_First1, _Last1) with [_Dest, ...)
代码如下:
swap_ranges(arr,arr+6,arr1);//交换两个空间大小相同的容器
继续replace函数,替换某个元素
void replace(_FwdIt _First, _FwdIt _Last,const _Ty& _Oldval, const _Ty& _Newval);// replace each matching _Oldval with _Newval
使用如下:
replace(arr1,arr1+2,12,100);//替换12为100
最后说一下ostream_iterator,用于直接从容器中输出数据,第一个参数是输出流,第二个是数据之间的分隔符
ostream_iterator(ostream_type& _Ostr,
const _Elem *_Delim = 0)
: _Myostr(&_Ostr), _Mydelim(_Delim)
{ // construct from output stream(输出流) and delimiter(分隔符)
}
使用方法如下:
cout<<"\narr1:"<<endl;
copy(arr1,arr1+6,ostream_iterator<int>(cout," "));
replace(arr1,arr1+2,12,100);//替换某数据
cout<<"\n after replace, arr1:"<<endl;
copy(arr2,arr1+6,ostream_iterator<int>(cout," "));
第二种是不可修改型算法,这种算法之对数据进行,查找,排序,搜索等操作
首先来看查找find函数,查找第一个符合条件的值,若找到成功,返回指向改值的迭代器,没有找到,指向v1.end()
_InIt find(_InIt _First, _InIt _Last, const _Ty& _Val);// find first matching _Val
使用方法:

int a[10] = {12,31,5,2,23,121,0,89,34,66};
vector<int> v1(a,a+10);
vector<int>::iterator result1,result2;//随机访问迭代器
result1 = find(v1.begin(),v1.end(),2);//若找到成功,返回指向2的迭代器
result2 = find(v1.begin(),v1.end(),8);//没有找到,指向v1.end()
if ((result1 - v1.begin())<10)//结果小于10,说明数据存在
{
cout<<"find it"<<endl;
cout<<*result1<<endl;
}
else
cout<<"not find it"<<endl;
cout<<result2 - v1.begin()<<endl;//10,说明没有找到

接着看搜索函数search,搜索区间2中数据是否有在区间1里的,有的话返回区间1里第一个找到的值的位置
_FwdIt1 search(_FwdIt1 _First1, _FwdIt1 _Last1,_FwdIt2 _First2, _FwdIt2 _Last2);// find first [_First2, _Last2) match
用法如下:

int b[9]={5,2,23,54,5,5,5,2,2};
vector<int> v2(a+2,a+8);
vector<int> v3(b,b+4);
//在v1中找到序列v2,result1指向v2在v1中开始的位置,就是指向找到的第一个元素
result1=search(v1.begin(),v1.end(),v2.begin(),v2.end());
cout<<*result1<<endl;//找到并输出
//在v1中没有找到序列v3,result1指向v1中结束的位置,v1.end()
result1=search(v1.begin(),v1.end(),v3.begin(),v3.end());
cout<<*(result1-1)<<endl;//没有找到,返回最后一个值

现在看排序算法sort,默认升序排列
template<class _RanIt> inline
void sort(_RanIt _First, _RanIt _Last);// order [_First, _Last), using operator<
用法如下:

int d[10]={12,0,5,3,6,8,9,34,32,18};
int e[5]={5,3,6,8,99};
int f[15];
sort(d,d+10);
for(int i=0;i<10;i++)
cout<<" "<<d[i];
cout<<endl;
sort(e,e+5);
for(int i=0;i<5;i++)
cout<<" "<<e[i];

最后看一下include函数,用来判断一个容器中的数据是否全在另一个容器里,默认也是升序
// test if all [_First1, _Last1) in [_First2, _Last2), using operator<
bool includes(_InIt1 _First1, _InIt1 _Last1,_InIt2 _First2, _InIt2 _Last2);
使用如下:
if (includes(d,d+10,e,e+5))//e中数据是否全部在d中
{
cout<<"\n sorted b elements are included in a ."<<endl;
}
else
cout<<"\n b elements are not included in a ."<<endl;
常用算法就这么多,下一章看看神奇的迭代器
algorithm(算法)的更多相关文章
- 《Algorithm算法》笔记:元素排序(2)——希尔排序
<Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...
- C++ algorithm算法库
C++ algorithm算法库 Xun 标准模板库(STL)中定义了很多的常用算法,这些算法主要定义在<algorithm>中.编程时,只需要在文件中加入#include<algo ...
- Algorithm 算法
http://www.cnblogs.com/baiboy/category/723479.html 记下来,有空去看 随笔分类 - Algorithm [项目总结]自然语言处理在现实生活中运用 ...
- C++ vector类型要点总结(以及各种algorithm算法函数)
概述 C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现. 容器向量也是一个类模板.vector是C++标准模 ...
- c++11之 algorithm 算法库新增 minmax_element同时计算最大值和最小值
0.时刻提醒自己 Note: vector的释放 1. minmax_element 功能 寻找范围 [first, last) 中最小和最大的元素. 2. 头文件 #include <algo ...
- STL algorithm算法merge(34)
merge原型: std::merge default (1) template <class InputIterator1, class InputIterator2, class Outpu ...
- 06 - 从Algorithm 算法派生类中删除ExecuteInformation() 和ExecuteData() VTK 6.0 迁移
在先前的vtk中,如vtkPointSetAlgorithm 等算法派生类中定义了虚方法:ExecuteInformation() 和 ExecuteData().这些方法的定义是为了平稳的从VTK4 ...
- STL algorithm算法mismatch(37)
mismatch原型: std::mismatch equality (1) template <class InputIterator1, class InputIterator2> p ...
- STL algorithm算法is_permutation(27)
is_permutation原型: std::is_permutation equality (1) template <class ForwardIterator1, class Forwar ...
- STL algorithm算法lower_bound和upper_bound(31)
lower_bound原型: function template <algorithm> std::lower_bound default (1) template <class F ...
随机推荐
- ACM 入门计划
acm 本文由swellspirit贡献 ACM • I can accept failure. but I can't accept not trying. Life is often compar ...
- 前端项目部署之Grunt
如果你的前端项目很小或都者项目不需要通过专门的运维同学走流水线上线部署的话,那么可以略过以下的繁文. ok,Let's go! 我们看看如何使用grunt来部署上线项目? 前端项目一般分为两种类型:T ...
- txt 开关 csv 可通用 工具
Ruby Txt 开关 CSV 常用工具 to require 'csv' namespace :sys_file_conver do desc "把txt数据导入到csv中" t ...
- UVa 740 - Baudot Data Communication Code
称号:目前编码,他们shift键被按下,并提出,对应的两个编码,其中,2相应的编码shift操作. 给你适当的编码值.寻求相应的字符串. 分析:模拟.字符串. 简单题,标记shift的升降分类处理就可 ...
- 【百度地图API】建立全国银行位置查询系统(二)——怎样为地图添加控件
原文:[百度地图API]建立全国银行位置查询系统(二)--怎样为地图添加控件 <摘要>你将在第二章中学会以下知识: 使用手写代码的利器——notepad++: 如何为地图添加控件——鱼骨. ...
- 在Mac电脑上为Dash制作docSet文档
Dash是mac上的一款查看API的工具,里面能够直接下载大部分的API文档,可是有时候我们假设想把自己手里已有的文档也集成到Dash中,就须要我们自己动手了,事实上Dash官方也有教程怎样制作doc ...
- poj 1068 Parencodings 模拟
进入每个' ) '多少前' ( ', 我们力求在每' ) '多少前' ) ', 我的方法是最原始的图还原出来,去寻找')'. 用. . #include<stdio.h> #incl ...
- WSockExpert[抓包工具]
一.WSockExpert简单介绍 WSockExpert是一个抓包工具,它能够用来监视和截获指定进程网络数据的传输,对測试站点时非常实用.在黑客的手中,它经常被用来改动网络发送和接 ...
- 泛型委托及委托中所涉及到匿名方法、Lambda表达式
泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...
- Struts2和Struts1的主要区别(完整版)
Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Act ...