一,巡防算法
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;
}
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】算法 中各种算法解析)