复制一组数据
1 复制 copy(pos_begin,pos_end,pos_dest_beg)
2 带条件的复制 remove_copy_if(pos_begin,pos_end,pos_dest_beg, func)bool func(一个元素) 不满足条件的才复制
3 从后往前复制复制 copy_backward(pos_beg,pos_end,pos_dest_end);
4 注意目标地址一定要是已分配的空间 .
若未分配空间直接往pos_dest_beg写入会造成越界错误,这时要替换成 back_inserter(v) ,将元素v.push_back(*ib)进去.而不是*p+== *ib++;
#include <algorithm>
#include <iostream>
using namespace std;
#include <vector>
#include "show.h"
#include <cstring>
#include <deque>
//复制的写法
template <typename Iter,typename Pos>
void co(Iter ib,Iter ie,Pos p)
{
while(ib != ie)
{
*p++ = *ib++;
}
}
//倒着复制的写法
template <typename Iter,typename Pos>
void co_back(Iter ib,Iter ie,Pos p)
{
while(ib != ie)
{
*--p = *--ie;
}
}
bool func(int element)
{
return element>=5;
}
int main()
{
int a[5] = {3,9,2,6,8};
vector<int> vi(a,a+5);
//show(vi.begin(),vi.end()); //3 9 2 6 8
sort(vi.begin(),vi.end()); //排序
show(vi.begin(),vi.end());
/* 拷贝 */
copy(vi.begin(),vi.end(),a); //区间,目地地
show(a,a+5,',');
//使用自定义的复制函数
int b[8] = {0};
co(vi.begin(),vi.end(),b);
show(b,b+8);
//如果原区域和目标区域有重叠时 要考虑赋值的顺序: 倒着复制
copy_backward(b,b+5,b+8);
//co_back(b,b+5,b+8);
show(b,b+8);
/*带条件的复制 和 对拷贝到的地方 (防越界)*/
cout << "-------------" << endl;
show(a,a+5 ); //2 3 6 8 9
//remove_copy_if 函数 当不满足func的条件时,复制
deque<int > v;
remove_copy_if(a,a+5,back_inserter(v),func); //,back_inserter(v) 把对元素的赋值转化为对容器的后插入
show(v.begin(),v.end());//2 3
/*
因为V并没有分配空间,采用*p++ = *ib++;时 p就会越界。
使用,back_inserter可以将p++变成.push_back
前插入 front_inserter()
注意:不支持push_front() 前插的 类型不可用 如 vector
*/
remove_copy_if(a,a+5,front_inserter(v),func);
show(v.begin(),v.end()); //3 2 2 3 因为是前插 所以插入顺序是 3 2
v.clear();
}