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(算法)的更多相关文章

  1. STL学习笔记(排序算法)

    STL提供了好几种算法对区间内的元素排序.出来完全排序外,还支持局部排序. 对所有元素排序 void sort(RandomAccessIterator beg,RandomAccessIterato ...

  2. STL学习笔记(变动性算法)

    本节描述的算法会变动区间内的元素内容.有两种方法可以变动元素内容: 1.运用迭代器遍历序列的过程中,直接加以变动 2.将元素从源区间赋值到目标区间的过程中加以变动 复制(copy)元素 OutputI ...

  3. Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...

  4. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  5. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  6. 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 ...

  7. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  8. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

  9. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

随机推荐

  1. Spring mvc + maven + tomcat配置问题

    在用maven搭建spring mvc时候, 个人遇到过很多的问题, 现在把遇到的问题总结下: 1.  首先点击项目->Run As->Maven clean, 这一步把之前不管有没有ma ...

  2. Spring之IOC核心模块详解

    Spring IOC简述 IOC称为控制反转,也有一种说法叫DI(依赖注入).IOC也是spring最核心的模块,Spring的所有工作几乎都围绕着IOC展开. 什么是控制反转呢?简单的说,控制反转就 ...

  3. 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)

    点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...

  4. GBDT回归的原理及Python实现

    一.原理篇 1.1 温故知新回归树是GBDT的基础,之前的一篇文章曾经讲过回归树的原理和实现.链接如下: 回归树的原理及Python实现 1.2 预测年龄仍然以预测同事年龄来举例,从<回归树&g ...

  5. 告诉你今年是哪个生肖年的java程序

    package com.swift; import java.util.Scanner; public class ChineseYear { public static void main(Stri ...

  6. 通过Tcode查找Badi或者客户出口

    https://wiki.scn.sap.com/wiki/display/ABAP/Code+To+Find+BAdi Created by Naresh Reddy K, last modifie ...

  7. jstl(c)标签

    一.EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能.脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java 代码 ...

  8. windows下简单使用pip

    1. 在python官网上下载python时会自带pip,并且在安装Python时若未取消会默认一并安装 2. 找出pip.exe所在位置, 3. 右击此电脑,点击属性 4. 高级系统设置 5. 点击 ...

  9. Linux更改文件权限(一)

    更改文件权限(一)============================== (参考于千锋教育教学笔记) 设置权限 1.更改文件的属主.属组chown (change owner)[root@ami ...

  10. Python9-MySQL数据库安装及基本操作-day42

    MySQL 单机程序(自己DB) 单机程序(共用DB)MySQL:用于管理文件的一个软件 -服务端软件 -socket服务端 -本地文件操作 -解析指令[SQL语句] -客户端软件(各种各样) -so ...