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. 二、C++复数的实现

    C++复数的实现 在数字图像处理领域,复数这一类型会被经常使用到.但是在C++和Qt中都没有可以使用的复数类.为了今后的方便,我们可以自己定义一个C++复数类,以便将来使用. 一.复数的属性 复数包含 ...

  2. 阻止Bootstrap 模态框(Modal)点击空白处时关闭

    默认情况下点击空白处时会关闭模态框,添加data-backdrop="static"后可以阻止关闭

  3. crontab配置shell实现后台进程不间断运行

    检测get_report_no.php进程是否一直在运行 #!/bin/bash PROC=`ps -ef |grep get_report_no.php|grep -v grep|wc -l` if ...

  4. LeetCode Reverse Bits 反置位值

    题意:给定一个无符号32位整数,将其二进制形式左右反置,再以整型返回. 思路:循环32轮,将n往右挤出一位就补到ans的尾巴上. class Solution { public: uint32_t r ...

  5. POJ 3187 Backward Digit Sums (递推,bruteforce)

    第1行j列的一个1加到最后1行满足杨辉三角,可以先推出组合数来 然后next_permutation直接暴. #include<cstdio> #include<iostream&g ...

  6. Android(java)学习笔记81:在TextView组件中利用Html插入文字或图片

    1. TextView中利用Html插入文字或者图片: 首先我们看看代码: (1)activity_main.xml: <LinearLayout xmlns:android="htt ...

  7. C#的接口基础教程之四 访问接口

    对接口成员的访问 对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的.如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员.但由于接口支持多继承,在多继承中,如果 ...

  8. JQuery根据关键字检索html元素并筛选显示

    背景:标题比较唬人,实际上就是在文本框中输入关键字,通过关键字检索html元素,筛选后显示在界面上. Html元素如下: <div> <input type="text&q ...

  9. 线程池是什么?Java四种线程池的使用介绍

    使用线程池的好处有很多,比如节省系统资源的开销,节省创建和销毁线程的时间等,当我们需要处理的任务较多时,就可以使用线程池,可能还有很多用户不知道Java线程池如何使用?下面小编给大家分享Java四种线 ...

  10. select * 比select column快很多奇怪案例分析

    遇到MYSQL傻傻的地方,下面给个案例,大家感受下: 注意以下两个sql只有select *和select g.id区别. SQL1:SELECT g.idFROM table1 gINNER JOI ...