移除性算法
来源:互联网 发布:led显示屏播放软件 编辑:程序博客网 时间:2024/04/29 08:44
根据元素值或某一准则,在一个区间内移除某些元素。这些算法并不能改变元素的数量,它们只是以逻辑上的思考,将原本置于后面的"不移除元素"向前移动,覆盖那些被移除元素而已。它们都返回新区间的逻辑终点(也就是最后一个”不移除元素"的下一个位置)
1.移除某些特定元素
移除某序列内的元素
- ForwardIterator remove( ForwardIterator beg, ForwardIterator end, const T& value)//移除区间[beg,end)中每个"与value相等"的元素。返回变动后序列的新逻辑终点(也就是最后一个未被移除元素的下一位置)。
- ForwardIterator remove_if( ForwardIterator beg, ForwardIterator end, UnaryPredicate op)//移除使op(elem)获得true的元素。
// STL.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <print.hpp>#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){vector<int> coll;INSERT_ELEMENTS(coll,2,6);INSERT_ELEMENTS(coll,4,9);INSERT_ELEMENTS(coll,1,7);PRINT_ELEMENTS(coll,"coll: ");vector<int>::iterator pos;pos=remove(coll.begin(),coll.end(),5);PRINT_ELEMENTS(coll,"size not changed: ");coll.erase(pos,coll.end());PRINT_ELEMENTS(coll,"size changed:");coll.erase(remove_if(coll.begin(),coll.end(),bind2nd(less<int>(),4)),coll.end());PRINT_ELEMENTS(coll,"<4 removed: ");return 0;}
复制时一并移除元素
- OutputIterator remove_copy( InputIterator sourceBeg, InputIterator sourceEnd, OutputItertor destBeg, const T& value)//将源[beg, end)内的所有元素复制到"以destBeg为起点"的目标区间去,并在复制过程中移除"与value相等"的所有元素。返回目标区间中最后一个被复制元素的下一个位置(也就是第一个未被覆盖的元素)
- OutputIterator remove_copy_if( InputIterator sourceBeg, InputIteratorSourceEnd, OutputIterator destBeg, UnaryPredicate op)//满足op(elem)为true的元素
- 注:不修改源区间,所有结果只反映在destBeg的目标区间,先移除,再复制。
// STL.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <print.hpp>#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){list<int> coll1;INSERT_ELEMENTS(coll1,1,6);INSERT_ELEMENTS(coll1,1,9);PRINT_ELEMENTS(coll1);remove_copy(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "),3);cout<<endl;remove_copy_if(coll1.begin(),coll1.end(),ostream_iterator<int>(cout," "),bind2nd(greater<int>(),4));cout<<endl;multiset<int> coll2;remove_copy_if(coll1.begin(),coll1.end(),inserter(coll2,coll2.end()),bind2nd(less<int>(),4));PRINT_ELEMENTS(coll2);return 0;}
2.移除重复元素
移除连续重复元素
- ForwardIterator unique( ForwardIterator beg, ForwardIterator end)//移除区间[beg, end)连续重复的元素中的多余元素
- ForwardIterator unique( ForwardIterator beg, ForwardIterator end, BinaryPredicate op)//将每一个位于e之后的并使op(elem,e)结果为true的所有elem被移除。(e在elem前一个位置,e未被移除)
// STL.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <print.hpp>#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){int source[]={1,4,4,6,1,2,2,3,1,6,6,6,5,7,5,4,4};int sourceNum=sizeof(source)/sizeof(source[0]);list<int> coll;copy(source,source+sourceNum,back_inserter(coll));PRINT_ELEMENTS(coll);list<int>::iterator pos;pos=unique(coll.begin(),coll.end());copy(coll.begin(),pos,ostream_iterator<int>(cout," "));cout<<"\n\n";copy(source,source+sourceNum,coll.begin());PRINT_ELEMENTS(coll);coll.erase(unique(coll.begin(),coll.end(),greater<int>()),coll.end());PRINT_ELEMENTS(coll);return 0;}
复制过程中移除重复元素(copy()和unique()的组合)
- OutputIterator unique_copy( InputIterator sourceBeg, InputIterator sourceEnd, OutputIterator destBeg)//将源区间[beg,end)内的元素复制到”以destBeg起始的目标区间",并移除重复元素。返回目标区间内"最后 一个被复制的元素"的下一位置。
- OutputIterator unique_copy( InputIterator sourceBeg, InputIterator sourceEnd, OutputIterator destBeg, BinaryPredicate op)
// STL.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <print.hpp>#include <iostream>using namespace std;bool differenceOne(int elem1, int elem2){return (elem1+1==elem2)||(elem1-1==elem2);}int _tmain(int argc, _TCHAR* argv[]){int source[]={1,4,4,6,1,2,2,3,1,6,6,6,5,7,5,4,4};int sourceNum=sizeof(source)/sizeof(source[0]);list<int> coll;copy(source,source+sourceNum,back_inserter(coll));PRINT_ELEMENTS(coll);unique_copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));cout<<endl;unique_copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "),differenceOne);cout<<endl;return 0;}
// STL.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <print.hpp>#include <iostream>using namespace std;bool bothspaces(char elem1, char elem2){return elem1==' ' && elem2==' ';}int _tmain(int argc, _TCHAR* argv[]){cin.unsetf(ios::skipws);//默认cin会过滤空白(空格,表格键等)// copy(istream_iterator<char>(cin),istream_iterator<char>(),// ostream_iterator<char>(cout));unique_copy(istream_iterator<char>(cin),istream_iterator<char>(),ostream_iterator<char>(cout),bothspaces);return 0;}
- 移除性算法
- STL算法之移除性算法
- 算法三:移除性算法、变序性算法、排序算法、已区间算法、数值算法
- C++ 标准库---移除性算法之二移除重复元素
- STL 移除性算法的一个特性
- C++标准库---移除性算法之一remove()&remove_if()
- STL移除型算法remove
- STL算法 移除.删除(更易型)
- STL学习笔记----12.STL算法之 (移除性算法)
- STL学习笔记----12.STL算法之 (移除性算法)
- 大数相除算法
- C++ 之高效使用STL(移除算法的选择)
- C++标准库---序列式容器的移除算法
- 简单的算法问题3——元素移除
- 算法---移除数组中的指定元素(简单)
- 辗转相除算法原理
- 算法模版 辗转相除
- 辗转相除算法原理
- linux查看网卡驱动的方法
- SQL2008附加数据库时出错的解决办法 错误代号5120
- Android状态栏功能介绍
- android实现uc和墨迹天气那样的左右拖动效果
- 数据库数组
- 移除性算法
- 解析:HTTP 错误 401.1 - 未经授权:访问由于凭据无效被拒绝。
- C++11 FAQ中文版:委托构造函数(Delegating constructors)
- 线段树 扫描线求矩阵面积并的模板(zz)
- 默然日记20120502
- VC 消息框大全
- Patch Set 11.2.0.2 for Win32 and Win64 now available
- [教程] [教程]RedHat9安装图解
- 到底是鞭笞打击下进步快还是在鼓励下进步快?