STL学习之十四:常用算法 for_each 和 transform以及adjacent_find的示例代码

来源:互联网 发布:mac sdk 配环境变量 编辑:程序博客网 时间:2024/04/29 12:17

本文主要介绍STL中常用算法 for_each 和 transform以及adjacent_find示例代码,具体用法示例如下:

// 1  for_each :用指定函数依次对指定范围内所有元素进行迭代访问 该函数不得修改序列中的元素//template<class _InIt,//class _Fn1> inline//_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)//{// perform function for each element//_DEBUG_RANGE(_First, _Last);//_DEBUG_POINTER(_Func);//return (_For_each(_Unchecked(_First), _Unchecked(_Last), _Func));//}// 返回的是第三个参数的 函数对象类型// 2 transform :与for_each类似,遍历所有元素,但可以对容器的元素进行修改#include "iostream"using namespace std;#include "vector"#include "set"#include "queue"#include "list"#include "algorithm"#include "string"#include "functional"#include "iterator"//template <typename T>//void printMy(T<int> &my)//{//for (T<int>::iterator it=my.begin();it!=my.end();it++)//{//cout << *it << " ";//}//cout << endl;//}void printV(vector<int> &v){for (vector<int>::iterator it=v.begin();it!=v.end();it++){cout << *it << " ";}cout << endl;}void printList(list<int> &v){for (list<int>::iterator it=v.begin();it!=v.end();it++){cout << *it << " ";}cout << endl;}void showElem(int &n){cout << n << " ";}class CMyElem{public:CMyElem(){num = 0;}void operator()(int &n){num++;cout << n << " ";}void printNum(){cout << "num:" << num << endl;}protected:private:int num;};void main31_foreach(){vector<int> v1;v1.push_back(1);v1.push_back(3);v1.push_back(5);printV(v1);//printMy<vector <int>>(&v1);//void printMy(T<int> &my)for_each(v1.begin(),v1.end(),showElem);cout << endl;for_each(v1.begin(),v1.end(),CMyElem());cout << endl;CMyElem my1 = for_each(v1.begin(),v1.end(),CMyElem());// 返回的是第三个参数的 函数对象类型my1.printNum();}int increase(int i){return i+100;}void main32_transform(){vector<int> v1;v1.push_back(1);v1.push_back(3);v1.push_back(5);//printMy<vector <int>>(&v1);//void printMy(T<int> &my)// transform 使用回调函数transform(v1.begin(),v1.end(),v1.begin(),increase);printV(v1);//printMy<vector <int>>(&v1);//void printMy(T<int> &my)// transform 使用预定义的函数对象transform(v1.begin(),v1.end(),v1.begin(),negate<int>());printV(v1);//printMy<vector <int>>(&v1);//void printMy(T<int> &my)// transform 使用函数适配器 和函数对象list<int> mylist;mylist.resize(v1.size());transform(v1.begin(),v1.end(),v1.begin(),bind2nd(multiplies<int>(),10));printList(mylist);//printMy<list<int>>(mylist);//void printMy(T<int> &my)// 也可以吧运算结果 直接输出到屏幕transform(v1.begin(),v1.end(),ostream_iterator<int>(cout," "),negate<int>());}// 常用的查找算法// adjacent_find 在iterator对标识元素范围内,查找一对相邻重复元素,// 找到则返回指向这对元素的第一个元素的迭代器void main33(){vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(2);v1.push_back(3);v1.push_back(5);vector<int>::iterator it = adjacent_find(v1.begin(),v1.end());if (it == v1.end()){cout << "没有找到" << endl;}else{cout << *it << endl;}int index = distance(v1.begin(),it);cout << "index:" <<index << endl;}void main34_binary_search(){vector<int> v1;v1.push_back(1);v1.push_back(3);v1.push_back(5);v1.push_back(7);v1.push_back(9);bool b = binary_search(v1.begin(),v1.end(),7);if ( b == true){cout << "找到" << endl;}else{cout << "没有找到" << endl;}}void main(){//main31_foreach();//main32_transform();//main33();main34_binary_search();cout << "hello..."<< endl;system("pause");}