STL学习笔记7 ---- 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[] = {,,,,,};
int arr1[];
copy(arr,arr+,arr1);//(0-5)将arr中前六个数据拷贝到arr1中
cout<<"将arr[6]copy到arr[1]:"<<endl;
for (int i = ;i < ;i ++)
{
cout<<arr1[i]<<" ";
}
接下来看reverse函数,将容器中数据反转
void reverse(_BidIt _First, _BidIt _Last);// reverse elements in [_First, _Last)
看代码如何实现:
reverse(arr,arr+);//将arr中前六个数据反转,
cout<<"\n将arr数据反转:"<<endl;
for (int i = ;i < ;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+,arr1);//交换两个空间大小相同的容器
继续replace函数,替换某个元素
void replace(_FwdIt _First, _FwdIt _Last,const _Ty& _Oldval, const _Ty& _Newval);// replace each matching _Oldval with _Newval
使用如下:
replace(arr1,arr1+,,);//替换12为100
最后说一下ostream_iterator,用于直接从容器中输出数据,第一个参数是输出流,第二个是数据之间的分隔符
ostream_iterator(ostream_type& _Ostr,
const _Elem *_Delim = )
: _Myostr(&_Ostr), _Mydelim(_Delim)
{ // construct from output stream(输出流) and delimiter(分隔符)
}
使用方法如下:
cout<<"\narr1:"<<endl;
copy(arr1,arr1+,ostream_iterator<int>(cout," "));
replace(arr1,arr1+,,);//替换某数据
cout<<"\n after replace, arr1:"<<endl;
copy(arr2,arr1+,ostream_iterator<int>(cout," "));
第二种是不可修改型算法,这种算法之对数据进行,查找,排序,搜索等操作
首先来看查找find函数,查找第一个符合条件的值,若找到成功,返回指向改值的迭代器,没有找到,指向v1.end()
_InIt find(_InIt _First, _InIt _Last, const _Ty& _Val);// find first matching _Val
使用方法:
int a[] = {,,,,,,,,,};
vector<int> v1(a,a+);
vector<int>::iterator result1,result2;//随机访问迭代器
result1 = find(v1.begin(),v1.end(),);//若找到成功,返回指向2的迭代器
result2 = find(v1.begin(),v1.end(),);//没有找到,指向v1.end()
if ((result1 - v1.begin())<)//结果小于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[]={,,,,,,,,};
vector<int> v2(a+,a+);
vector<int> v3(b,b+);
//在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-)<<endl;//没有找到,返回最后一个值
现在看排序算法sort,默认升序排列
template<class _RanIt> inline
void sort(_RanIt _First, _RanIt _Last);// order [_First, _Last), using operator<
用法如下:
int d[]={,,,,,,,,,};
int e[]={,,,,};
int f[];
sort(d,d+);
for(int i=;i<;i++)
cout<<" "<<d[i];
cout<<endl;
sort(e,e+);
for(int i=;i<;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+,e,e+))//e中数据是否全部在d中
{
cout<<"\n sorted b elements are included in a ."<<endl;
}
else
cout<<"\n b elements are not included in a ."<<endl;
常用算法就这么多,下一章看看神奇的迭代器
STL学习笔记7 ---- algorithm(算法)的更多相关文章
- STL学习笔记(排序算法)
STL提供了好几种算法对区间内的元素排序.出来完全排序外,还支持局部排序. 对所有元素排序 void sort(RandomAccessIterator beg,RandomAccessIterato ...
- STL学习笔记(变动性算法)
本节描述的算法会变动区间内的元素内容.有两种方法可以变动元素内容: 1.运用迭代器遍历序列的过程中,直接加以变动 2.将元素从源区间赋值到目标区间的过程中加以变动 复制(copy)元素 OutputI ...
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value
Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...
- Effective STL 学习笔记 32 ~ 33
Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
随机推荐
- Google地址
Google的访问一直很不稳定,经常被墙,无意间发现以下一些地址,特此记录. https://g.ttlsa.com/ https://wen.lu/ http://sinaapp.co https: ...
- spring的struts简单介绍
之前一段时间学习了springmvc+mybatis+spring框架,突然对之前的struts东西有点陌生, 所以这里简单记录下温故而知新的东西吧. 1. 首先建立一个Dynamic Web Pr ...
- SqlServer作业指定目标服务器
用SSMS生成数据库作业的创建脚本的时候,有一步是sp_add_jobserver操作: EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = ...
- ADS主要仿真器介绍
ADS主要仿真器介绍 ADS ( Advanced Design System ) 是美国Agilent公司推出的电路和系统分析软件,它集成多种仿真软件的优点,仿真手段丰富多样,可实现包 ...
- VMware安装win7系统
1.创建一个虚拟机 2.配置iso映射文件 3.设置boot设置第一启动为cd 4.快速分区后重启电脑,然后选择[A]安装win7. 重启电脑后安装win7系统 搞定...
- 一、Web 如何工作的
平常我们在浏览器中输入一个网址,随即看到一个页面,这个过程是怎样实现的呢?下面用一幅图来说明: 整个流程如下: 1.域名解析 浏览器会解析域名对应的IP地址 PS:DNS服务器的知识 2.建立TCP ...
- 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)
点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...
- find - 递归地在层次目录中处理文件
总览 SYNOPSIS find [path...] [expression] 描述 DESCRIPTION 这个文档是GNU版本 find 命令的使用手册. find 搜索目录树上的每一个文件名,它 ...
- Cesium专栏-测量工具测距、测面、测高(附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
- Java连接MySQL数据库实现用户名密码的验证方法 Java语句中sql查询语句'' ""作用
//方法一,可以验证登录,但方法不实用.package com.swift; import java.sql.Connection; import java.sql.DriverManager; im ...