【C++ STL】算法 中各种算法解析

一,巡防算法

for_each(容器起始地址,容器结束地址,要执行的方法)


#include 
#include 
#include 

using namespace std;

template
struct plus2
{
	void operator()(T&x)const
	{
		x+=2;
	}
	
};

void printElem(int& elem)
{
  cout << elem << endl;
}


int main()
{
	int ia[]={0,1,2,3,4,5,6};
	for_each(ia,ia+7,printElem);//输出
	
	int ib[]={7,8,9,10,11,12,13};
	vector iv(ib,ib+7);
	for_each(iv.begin(),iv.end(),plus2());//更改元素
	for_each(iv.begin(),iv.end(),printElem);//输出
	
	
	return 0;
}


二,find算法

int *find(int *begin,int *end,int value)

前闭后合的区间 begin,end中,查找value如果查找到了就返回第一个符合条件的元素,否则返回end指针

#include 
#include 

using namespace std;

void printElem(int& elem)
{
  cout << elem << endl;
}


int main()
{
	int ia[]={0,1,2,3,4,5,6};
	
	int *i= find(ia,ia+7,9);//在整个数组中查找元素 9 
	int *j= find(ia,ia+7,3);//在整个数组中查找元素 3
	int *end=ia+7;//数组最后位置 
	if(i == end) 
	   cout<<"没有找到元素 9"<


三,数值算法

包含在头文件中

#include 
#include   //数值算法 
#include 
#include  
#include  

#include  
 using namespace std;
 
 int main()
 {
 	int ia[]={1,2,3,4,5};
 	vector iv(ia,ia+5);
 	
 	cout<())<(),plus())< oite(cout," ");//迭代器绑定到cout上作为输出使用
	partial_sum(iv.begin(),iv.end(),oite);//依次输出前n个数的和 
	
	cout<());//依次输出第一个数减去(除第一个数外到当前数的和)
	
	cout<()); //输出相邻元素差值 前面+后面  。前面更改影响后面元素 
	 
	 
	cout<


四,基本算法

#include 
#include 
#include 

using namespace std;

template
struct display
{
	void operator()(const T  &x)const
	{
		cout< iv1(ia,ia+5);
	vector iv2(ia,ia+9);
	
	pair::iterator,vector::iterator> pa;
	pa=mismatch(iv1.begin(),iv1.end(),iv2.begin());
	cout<<"两个数组不同点--第一个数组点:"<<*(pa.first)<())<());
	cout<());
	cout<::iterator ite1=iv1.begin();
	vector::iterator ite2=ite1;
	advance(ite2,3);//向前跳3个
	
	iter_swap(ite1,ite2);//交换迭代器指向的元素
	for_each(iv1.begin(),iv1.end(),display());
	 
    cout<<"\nmax:"<());
    
    
    cout<())<

五,copy()对不同容器复制;关于输出区间与输入区间重叠的讨论

#include 
#include 
#include 

using namespace std;
template
struct display
{
	void operator()(const T &x)const
	{
		cout<()); //2,3,4,5,6,5,6,7,8
	cout<()); //0,1,2,3,2,3,4,5,6
	cout< id(ia3,ia3+9);
	deque::iterator first=id.begin();
	deque::iterator last=id.end();
	deque::iterator result=id.begin();
	++++first;
	cout<<*first<());//2,3,4,5,6,5,6,7,8
	cout< ide(ia4,ia4+9);
	deque::iterator first1=ide.begin();
	deque::iterator last1=ide.end();
	deque::iterator result1=ide.begin();
	advance(result1,4);//注意这里跟上面不一样 
	++++first1;
	cout<<*first1<());// 0,1,2,3,2,3,2,3,2不是预期的 0,1,2,3,2,3,4,5,6
	cout<

【注意】如果以vector 容器替代deque容器则每种情况都正确,因为vector迭代器其实是个源生指针,调用的copy()算法以mommove()执行实际复制。

copy_backward(first,last,result); //逆向复制,将迭代器first - last位置的元素逆向复制到 从result-1开始的逆向区间


补充:

原型:void *memmove( void * dest, const void * src, size_t count );

  用法:#include 或#include
  功能:由src所指内存区域复制count个字节到dest所指内存区域。
  说明:src和dest所指内存区域可以重叠,但复制后dest内容会被更改。函数返回指向dest的指针。采取先拷贝再复制的方式,有效解决了dest和src区域重叠问题
  相关函数:memset、memcpy、strcpy 参考博文http://blog.csdn.net/tianshuai11/article/details/7624419

实例

  
#include 
#include 
int main()
{
  char s[]="Golden Global View";
   memmove(s,s+7,strlen(s)+1-7);
   printf("%s",s);
    
  return 0;
}

六,Set方法

#include 
#include 
#include 
#include 
using namespace std;

template 
struct display
{
	void operator()(const T &x)
	{
		cout< s1(ia1,ia1+6);
	multiset s2(ia2,ia2+7);
	for_each(s1.begin(),s1.end(),display());
	cout<());
	cout<::iterator first1 = s1.begin();
	multiset::iterator last1 = s1.end();
	multiset::iterator first2 = s2.begin();
	multiset::iterator last2 = s2.end();
	
	cout<<"union of s1 and s2: ";
	//两个集合合并,相同元素个数取 max(m,n)。 
	set_union(first1,last1,first2,last2,ostream_iterator(cout," "));
	cout<(cout," ")); 
	cout<(cout," ")); 
	cout<(cout," ")); 
	cout<

七,其他算法(运算逻辑相对单纯的算法)

#include 
#include 
#include 
#include 
#include  


using namespace std;

template 
struct display
{
	void operator()(const T &x)const
	{
		cout< iv(ia,ia+sizeof(ia)/sizeof(int));
	
	//找出iv之中相邻元素值相等的第一个元素 
	cout<<*adjacent_find(iv.begin(),iv.end())<())<(),7))<(),2))< iv2(ia+6,ia+8);//6 6
	
	for(int i=0;i()); 
	 cout<()); 
	 cout<()); //由于_X是static 所以接着 增长 
	 cout<()); //由于_X是static 所以接着 增长 
	 cout< iv3(12);//重新申请空间
	  remove_copy(iv.begin(),iv.end(),iv3.begin(),6);
      for_each(iv3.begin(),iv3.end(),display()); //由于_X是static 所以接着 增长 
      cout<,6));
      for_each(iv1.begin(),iv1.end(),display()); //由于_X是static 所以接着 增长 
      cout<,7));
      for_each(iv3.begin(),iv3.end(),display()); //由于_X是static 所以接着 增长 
      cout<

第二段算法示例:

#include 
#include 
#include 
#include 

using namespace std;

template 
struct display
{
	void operator()(const T &x)const
	{
		cout< iv(ia,ia+sizeof(ia)/sizeof(int));
	
	//将容器中6 替换为 3 
    replace(iv.begin(),iv.end(),6,3);
    for_each(iv.begin(),iv.end(),display()); //由于_X是static 所以接着 增长 
    cout< iv2(12); 
	//将容器中3 替换为 5 放入另一个容器 
    replace_copy(iv.begin(),iv.end(),iv2.begin(),3,5);
    for_each(iv2.begin(),iv2.end(),display()); //由于_X是static 所以接着 增长 
    cout<(),5),2);
    for_each(iv.begin(),iv.end(),display()); //由于_X是static 所以接着 增长 
    cout<(),8),9);
    for_each(iv2.begin(),iv2.end(),display()); //由于_X是static 所以接着 增长 
    cout<());
	cout<());
	cout<());
    cout<());
    cout< iv3(ia2,ia2+2);
	cout<<*search(iv.begin(),iv.end(),iv3.begin(),iv3.end())<())<());//iv:2 8 2 8 7 10 8 8 7 2 8 
    cout<()); //iv3: 7 2 
    cout<(),2));
    for_each(iv.begin(),iv.end(),display());//0 6 0 6 5 8 6 6 5 0 6 
    cout<());
    for_each(iv.begin(),iv.end(),display());
    cout<


第三段算法示例:


#include 
#include 
#include 
#include 

using namespace std;

template 
struct display
{
	void operator()(const T &x)const
	{
		cout< iv(ia,ia+sizeof(ia)/sizeof(int));
	vector iv2(ia+4,ia+8);//4 5 6 6
	vector iv3(15);
	
    cout<<*max_element(iv.begin(),iv.end())<());
	cout<());
	cout<());
	cout<());
	cout<



八,复杂算法示例(解释在源码中)

#include 
#include 
#include 
#include 

using namespace std;

struct even //是否是奇数 
{
	bool operator()(int x)const
	{
		return x%2?false:true; 
	} 
	
}; 
template 
struct display
{
	void operator()(T &x)const
	{
		cout< iv(ia,ia+sizeof(ia)/sizeof(int));
	
	//返回可以插入的第一个位置 
	cout<<*lower_bound(iv.begin(),iv.end(),21)<());
	cout<());
	cout<());
	cout<());
	cout<());
	cout<());
	for_each(iv.begin(),iv.end(),display());
	cout<());
	cout<::iterator,vector::iterator> pairIte;
	//返回等于22的一个小区间 
	pairIte = equal_range(iv.begin(),iv.end(),22); 
    cout<<*(pairIte.first)<());
	cout<());
	cout<()); 
	for_each(iv.begin(),iv.end(),display());
	cout<());
	cout<






你可能感兴趣的:(【C++ STL】算法 中各种算法解析)