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

定义:一般不直接改变容器中元素的值,或者在复制到另一区间的过程中改变元素值
一、复制
原型:iterator2 copy(iterator1 first,iterator1 end,iterator2 dest);
定义:copy函数正向遍历序列,如果要把一个区间复制到前端,应该使用copy(),此时目标位置应该在first之前
原型:iterator2 copy_backward(iterator1 first,iterator1 end,iterator2 dest);
定义: copy_backward()函数逆向遍历序列,如果要把一个区间复制到后端,应该使用copy_backward(),此时目标位置dest应该在end后面

源代码如下:

#include "stdafx.h"
#include "iostream"
#include "algorithm"
#include "vector"
#include "list"
#include "iterator"
using namespace std;
void print(int& ele)
{
 cout<<ele<<" ";
}
int _tmain(int argc, _TCHAR* argv[])
{
 int dim[]={1,3,5,7,9,11,32,54,65};
 vector<int> v1;
 v1.assign(dim,dim+9);
 cout<<"vector v1:"<<endl;
 for_each(v1.begin(),v1.end(),print);
 cout<<endl;
 list<int> l1,l2;
 copy(v1.begin(),v1.end(),back_inserter(l1));//目标是空容器时要使用插入型迭代器back_inserter
 cout<<"list l1:"<<endl;
 for_each(l1.begin(),l1.end(),print);
 cout<<endl;
 //输出l2
 l2=l1;
 cout<<"list l2:"<<endl;
 copy(l2.begin(),l2.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 copy_backward(v1.begin()+2,v1.begin()+7,l2.end());
 cout<<"list l2(Modified):"<<endl;
 copy(l2.begin(),l2.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 return 0;
}

二、转换
原型:iterator2 transform(iterator1 first,iterator1 last,iterator2 dest,Unop op);
定义:将[first,last]中每个元素均调用函数op(ele),并将结果写入到以dest为其实的目标区间内,函数返回被转换的最后一个元素的下一个位置
原型:iterator2 transform(iterator1 first1,iterator1 last1,iterator2 first2,iterator3 dest,Binop op);
定义:将[first1,last1]中每个元素以及以first2开始的另一个区间,调用op(ele1,ele2)函数,并把结果存入到以dest开头的另一个区间内
源代码如下:

#include "stdafx.h"
#include "iostream"
#include "algorithm"
#include "vector"
#include "list"
#include "iterator"
using namespace std;
void print(int& ele)
{
 cout<<ele<<" ";
}
int _tmain(int argc, _TCHAR* argv[])
{
 int dim[]={1,3,5,7,9,11,32,54,65};
 vector<int> v1;
 v1.assign(dim,dim+9);
 cout<<"vector v1:"<<endl;
 for_each(v1.begin(),v1.end(),print);
 cout<<endl;
 list<int> l1,l2;
 //l2中D的?元a素?分?别e乘?以?-1
 transform(v1.begin(),v1.end(),back_inserter(l1),negate<int>());
 cout<<"list l1:";
 for_each(l1.begin(),l1.end(),print);
 cout<<endl;
 //另?外a一?种?用?法?两?个?容Y器?的?元a素?对?应|相?乘?
 transform(v1.begin(),v1.end(),l1.begin(),back_inserter(l2),multiplies<int>());
 cout<<"list l2:";
 for_each(l2.begin(),l2.end(),print);
 cout<<endl;
 return 0;
}

三、互换
原型:swap(T& a,T& b)
定义:用于交换两个类型相同的容器的所有对象
原型:swap_ranges(iterator1 first1,iterator last1,iterator2 first2)
定义:用于交换容器对象1的[first1,last1]和容器2的first2开始的对应区间
源代码如下:

#include "stdafx.h"
#include "iostream"
#include "algorithm"
#include "vector"
#include "list"
#include "iterator"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
 int dim[]={1,2,3,4,5,6,7,8,9};
 int dim2[]={11,12,13,14,15,16,17,18,19};
 vector<int> v1,v2;
 v1.assign(dim,dim+9);
 cout<<"vector v1:"<<endl;
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 copy(dim2,dim2+9,back_inserter(v2));
 cout<<"vector v2:"<<endl;
 copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 cout<<"交?换?后?:o"<<endl;
 swap(v1,v2);
 cout<<"vector v1:"<<endl;
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 cout<<"vector v2:"<<endl;
 copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 cout<<"再?次?交?换?部?分?元a素?:o"<<endl;
 swap_ranges(v1.begin(),v1.begin()+5,v2.begin());
 cout<<"vector v1:"<<endl;
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 cout<<"vector v2:"<<endl;
 copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 return 0;
}

四、赋值
原型:void fill(iterator first,iterator last,const T& x);
定义:给区间[first,last]赋相同的值x
原型:void fill_n(iterator first,size n,const T& x);
定义:从first开始给容器连续赋n个值x
void generator(iteraor first,iterator last Gen g);
定义:给区间[first,last]赋子进程或者仿函数g返回的值
原型:void generator_n(iterator first,size n,Gen g);
定义:从first开始给容器赋连续n个子进程或者仿函数的返回值
源代码如下:

#include "stdafx.h"
#include "iostream"
#include "algorithm"
#include "vector"
#include "list"
#include "iterator"
using namespace std;
int Fibonacci()
{
 static int r;
 static int f1 = 0;
 static int f2 = 1;
 r = f1+ f2;
 f1 = f2;
 f2 = r;
 return f1;
}
int _tmain(int argc, _TCHAR* argv[])
{
 vector<int> v1;
 vector<int> v2(5,0),v3(6,0);
 int dim[]={1,2,3,4,5,6,7,8,9};
 v1.assign(dim,dim+9);
 cout<<"vector v1:"<<endl;
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;


 fill(v1.begin(),v1.begin()+4,9);
 cout<<"vector v1:"<<endl;
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;


 fill_n(v1.begin(),5,20);
 cout<<"vector v1:"<<endl;
 copy(v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;


 generate(v2.begin(),v2.end(),rand);
 cout<<"vector v2:"<<endl;
 copy(v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
 cout<<endl;


 generate_n(v3.begin(),6,Fibonacci);
 cout<<"vector v3:"<<endl;
 copy(v3.begin(),v3.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值