STL算法库-非修改序列式操作(一)

一、定义
不改变元素的顺序,也不改变元素值,可用于所有的容器操作。
二、for_each()算法
原型:for_each(iterator begin,iterator end,proc op)
作用:for_each算法实现对区间[begin,end]中每一个元素均调用进程op
2.1 一般用法

如下,打印输出容器中的每一个元素:

#include "stdafx.h"
#include "algorithm"
#include "iostream"
#include "vector"
using namespace std;
void print(const int& i)
{
 cout<<i<<" ";
}
int _tmain(int argc, _TCHAR* argv[])
{
 vector<int> vec;
 vec.push_back(1);
 vec.push_back(2);
 vec.push_back(3);
 for_each(vec.begin(),vec.end(),print);
 system("pause");
 return 0;
}

2.2 for_each中使用仿函数

#include "stdafx.h"
#include "algorithm"
#include "iostream"
#include "vector"
using namespace std;
void print(const int& i)
{
 cout<<i<<" ";
}
template<typename T>
class Multiple
{
private:
 T theValue;
public:
 Multiple(T v):theValue(v)
 {
  
 }
 void operator()(T& elem)const//重载()操作符,可以像使用函数一样使用该类
 {
  elem*=theValue;
 }

};
int _tmain(int argc, _TCHAR* argv[])
{
 vector<int> vec;
 vec.push_back(1);
 vec.push_back(2);
 vec.push_back(3);

 for_each(vec.begin(),vec.end(),print);
 cout<<endl;
 for_each(vec.begin(),vec.end(),Multiple<int>(10));
 for_each(vec.begin(),vec.end(),print);
 cout<<endl;
 system("pause");
 return 0;
}

2.3 使用for_each的返回值

#include "stdafx.h"
#include "algorithm"
#include "iostream"
#include "vector"
using namespace std;
void print(const int& i)
{
 cout<<i<<" ";
}
template<typename T>
class Multiple
{
private:
 T theValue;
public:
 Multiple(T v):theValue(v)
 {
  
 }
 void operator()(T& elem)const
 {
  elem*=theValue;
 }
  operator int()
 {
  return static_cast<int>(theValue);
 }
};
int _tmain(int argc, _TCHAR* argv[])
{
 vector<int> vec;
 vec.push_back(1);
 vec.push_back(2);
 vec.push_back(3);

 for_each(vec.begin(),vec.end(),print);
 cout<<endl;
 int val=for_each(vec.begin(),vec.end(),Multiple<int>(10));
 for_each(vec.begin(),vec.end(),print);
 cout<<endl;
 cout<<"val="<<val<<endl;
 system("pause");
 return 0;
}

三、元素计数算法
原型:count(iterator begin,iterator end,const T& value)
定义:统计在区间[begin,end]中元素的值等于value的元素的个数。

原型:count_if(iterator begin,iterator end,UnaryPredicate op)
定义:统计在区间[begin,end]内使得op为真的元素的个数

举例如下:

#include "stdafx.h"
#include "algorithm"
#include "iostream"
#include "vector"
using namespace std;
void print(const int& i)
{
 cout<<i<<" ";
}
bool isEven(const int& i)
{
 return (i%2==0);
}
int _tmain(int argc, _TCHAR* argv[])
{
 vector<int> vec;
 vec.push_back(1);
 vec.push_back(2);
 vec.push_back(3);
 vec.push_back(2);

 for_each(vec.begin(),vec.end(),print);
 cout<<endl;
 int ct=count(vec.begin(),vec.end(),2);
 cout<<"元a素?值?等?于?的?元a素?的?个?数y是?"<<ct<<endl;
 ct=count_if(vec.begin(),vec.end(),isEven);
 cout<<"元a素?是?偶?数y的?元a素?的?个?数y是?"<<ct<<endl;
 ct=count_if(vec.begin(),vec.end(),bind2nd(greater<int>(),2));
    cout<<"值?大?于?的?元a素?的?个?数y是?"<<ct<<endl;
 system("pause");
 return 0;
}

四、最小值和最大值算法
4.1 最小值算法
原型:iterator min_element(iterator begin,iterator end)
定义:以operator<进行比较,返回最小值

原型:iterator min_element(iterator begin,iterator end,CompFunc op)
定义:以op(elem1,elem2)为真进行比较,如果第一个元素小于第二个元素,op应该返回true

4.2 最大值算法
原型:iterator max_element(iterator begin,iterator end)
定义:以operator>进行比较,返回最大值

原型:iterator max_element(iterator begin,iterator end,CompFunc op)
定义:以op(elem1,elem2)为假进行比较,如果第一个元素大于第二个元素,应该返回false

举例如下:

#include "stdafx.h"
#include "algorithm"
#include "iostream"
#include "vector"
using namespace std;
void print(const int& i)
{
 cout<<i<<" ";
}
bool miner(const int& elem1,const int& elem2)
{
 return elem1<elem2;
}

int _tmain(int argc, _TCHAR* argv[])
{
 vector<int> vec;
 vec.push_back(1);
 vec.push_back(2);
 vec.push_back(3);
 vec.push_back(2);

 for_each(vec.begin(),vec.end(),print);
 cout<<endl;
 vector<int>::iterator it=min_element(vec.begin(),vec.end());
 cout<<"容Y器?中D的?最?小?元a素?是?"<<*it<<endl;
 it=min_element(vec.begin(),vec.end(),miner);
 cout<<"容Y器?中D的?最?小?元a素?是?"<<*it<<endl;
 it=max_element(vec.begin(),vec.end());
 cout<<"容Y器?中D的?最?大?元a素?是?"<<*it<<endl;
 it=max_element(vec.begin(),vec.end(),miner);
 cout<<"容Y器?中D的?最?大?元a素?是?"<<*it<<endl;
 system("pause");
 return 0;
}
注意:如果存在多个最小值或者最大值,算法返回第一个找到的最小或者最大值

五、区间比较算法
5.1 equal()
原型:bool equal(iterator1 begin,iterator1 end,itaerator2 begin2)
定义:实现两个容器对象的比较,如果两个容器的元素相等,则返回true

原型:bool equal(iterator1 begin,iterator1 end,iterator2 begin2,Pred op)
定义:实现两个容器对象的比较,如果两个容器的对象使得op为真,则返回true

举例如下:

#include "stdafx.h"
#include "algorithm"
#include "vector"
#include "iostream"
using namespace std;

bool relation(const int& i,const int& j)
{
 return i==j;
}
int _tmain(int argc, _TCHAR* argv[])
{
 vector<int> vec1;
 vec1.push_back(2);
 vec1.push_back(3);
 vec1.push_back(4);
 vector<int> vec2;
 vec2.push_back(2);
 vec2.push_back(3);
 vec2.push_back(4);
 if(equal(vec1.begin(),vec1.end(),vec2.begin())==true)
  cout<<"两?个?容Y器?相?等?<<endl;
 if(equal(vec1.begin(),vec1.end(),vec2.begin(),relation)==true)
  cout<<"两?个?容Y器?相?等?<<endl;
 system("pause");
 return 0;
}

5.2 mismatch()
原型:pair<iterator1,iteraor2> mismatch(iterator1 begin1,iterator1 end1,iterator2 begin2)
定义:寻找对象之间两两相异的对应元素,如果没有找到相异点,函数返回值是一个pair,以第一个对象的end元素和第二个对象对应的元素组成

原型:pair<iterator1,iterator2> mismatch(iterator1 begin1,iterator1 end1,iterator2 begin2, Pred pr)
定义:寻找两个对象之间两两可以使pr为真的元素,如果没有找到相异点,函数返回值是一个pair,以第一个对象的end元素和第二个对象对应的元素组成

举例如下:

#include "stdafx.h"
#include "iostream"
#include "vector"
#include "algorithm"


using namespace std;

bool OperFunc(const int& i,const int& j)
{
	if(i>=j)
		return false;
	return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> vec1,vec2;
	vec1.push_back(1);
	vec1.push_back(2);
	vec1.push_back(3);
	vec2.push_back(1);
	vec2.push_back(3);
	vec2.push_back(3);
	pair<vector<int>::iterator,vector<int>::iterator> pr=mismatch(vec1.begin(),vec1.end(),vec2.begin());
	cout<<"vec1/vec2中第一对不同的元素分别是"<<*(pr.first)<<" "<<*(pr.second)<<endl;

	pair<vector<int>::iterator,vector<int>::iterator> pr1=mismatch(vec1.begin(),vec1.end(),vec2.begin(),OperFunc);
	cout<<"vec1/vec2中满足使得OperFunc为假的元素分别是"<<*(pr1.first)<<" "<<*(pr1.second)<<endl;
	return 0;
}
5.3 字典式比较lexicographical_compare()
比较原则:
1、如果两个元素不相等,则两个元素的比较结果即使两个序列的比较结果
2、如果两个容器数量不相等,则元素较少的序列小于另一个序列,即若第一序列元素的数量较少,则比较结果为true
3、如果两个序列没有更多的元素作比较,则两序列相等,比较结果为false

原型:
bool lexicographical_compare(iterator1 begin1,iterator1 end1,iterator2 begin2,iterator2 end2)
bool lexicographical_compare(iterator1 begin1,iterator1 end1,iterator2 begin2,iterator2 end2,Pred pr)

举例如下:

#include "stdafx.h"
#include "iostream"
#include "vector"
#include "algorithm"


using namespace std;

bool OperFunc(const int& i,const int& j)
{
 if(i>=j)
  return false;
 return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
 vector<int> vec1,vec2;
 vec1.push_back(1);
 vec1.push_back(2);
 vec1.push_back(3);
 vec2.push_back(1);
 vec2.push_back(3);
 vec2.push_back(3);
 bool pr=lexicographical_compare(vec1.begin(),vec1.end(),vec2.begin(),vec2.end());
 if(pr==true)
  cout<<"第?一?个?容Y器?较?小?"<<endl;

 bool pr1=lexicographical_compare(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),OperFunc);
 if(pr1==true)
  cout<<"vec1小?于鷙ec2"<<endl;
 return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值