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 ...
随机推荐
- Spring mvc + maven + tomcat配置问题
在用maven搭建spring mvc时候, 个人遇到过很多的问题, 现在把遇到的问题总结下: 1. 首先点击项目->Run As->Maven clean, 这一步把之前不管有没有ma ...
- Spring之IOC核心模块详解
Spring IOC简述 IOC称为控制反转,也有一种说法叫DI(依赖注入).IOC也是spring最核心的模块,Spring的所有工作几乎都围绕着IOC展开. 什么是控制反转呢?简单的说,控制反转就 ...
- 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)
点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...
- GBDT回归的原理及Python实现
一.原理篇 1.1 温故知新回归树是GBDT的基础,之前的一篇文章曾经讲过回归树的原理和实现.链接如下: 回归树的原理及Python实现 1.2 预测年龄仍然以预测同事年龄来举例,从<回归树&g ...
- 告诉你今年是哪个生肖年的java程序
package com.swift; import java.util.Scanner; public class ChineseYear { public static void main(Stri ...
- 通过Tcode查找Badi或者客户出口
https://wiki.scn.sap.com/wiki/display/ABAP/Code+To+Find+BAdi Created by Naresh Reddy K, last modifie ...
- jstl(c)标签
一.EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能.脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java 代码 ...
- windows下简单使用pip
1. 在python官网上下载python时会自带pip,并且在安装Python时若未取消会默认一并安装 2. 找出pip.exe所在位置, 3. 右击此电脑,点击属性 4. 高级系统设置 5. 点击 ...
- Linux更改文件权限(一)
更改文件权限(一)============================== (参考于千锋教育教学笔记) 设置权限 1.更改文件的属主.属组chown (change owner)[root@ami ...
- Python9-MySQL数据库安装及基本操作-day42
MySQL 单机程序(自己DB) 单机程序(共用DB)MySQL:用于管理文件的一个软件 -服务端软件 -socket服务端 -本地文件操作 -解析指令[SQL语句] -客户端软件(各种各样) -so ...