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 ...
随机推荐
- 利用python进行简单的图片处理
python的 PIL模块是专门用来处理图片的模块,其功能可以说是非常强大了. 演示环境:win7 操作系统 安装python2.7以及指定的对应PIL模块 我这里有一个现成的PIL模块.本文的大部分 ...
- uvm_hdl——DPI在UVM中的实现(四)
我们可以在uvm中实现HDL的后门访问,具体包括的function有uvm_hdl_check_path,uvm_hdl_deposit, uvm_hdl_force,uvm_hdl_release, ...
- DataGridView控件使用大全
转自:http://www.cnblogs.com/xiaofengfeng/archive/2011/04/16/2018504.html DataGridView控件 DataGridView是用 ...
- v-if与v-show的区别
一.区别 v-if 动态的向DOM树内添加或者删除DOM元素:“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建:在初始渲染条件为假时,什么也不做. v-sho ...
- cms-详细页面-3
1.设置上一条.下一条数据 2.使用昌言插件 3.点击链接帖子的访问数加一 1.在mapper中设置分页: <?xml version="1.0" encoding=&quo ...
- c++ STL deque容器成员函数
deque是双向队列,即可以在头部插入删除,也可以在尾部插入删除.内部并不连续,这一点和vector并不一样.可能第1个元素和第2个元素的地址是不连在一起的.在使用时用it迭代器会安全一点. 这是c+ ...
- 梦织未来Windows驱动编程 第04课 驱动相关的数据结构
- java Vamei快速教程21 事件响应
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在GUI中,我们看到了如何用图形树来组织一个图形界面.然而,这样的图形界面是静态的 ...
- POJ-2226 Muddy Fields---二分图匹配+巧妙构图
题目链接: https://vjudge.net/problem/POJ-2226 题目大意: 用宽度为1长度不限的木板将水洼‘*’盖住而不盖住草‘.' Sample Input 4 4 *.*. . ...
- 【BZOJ2120】数颜色(带修莫队)
点此看题面 大致题意:告诉你\(n\)只蜡笔的颜色,有两种操作:第一种操作将第\(x\)只蜡笔颜色改成\(y\),第二种操作询问区间\([l,r]\)内有多少种颜色的蜡笔. 考虑普通莫队 这题目第一眼 ...