码迷,mamicode.com
首页 > 编程语言 > 详细

C++Primer 5th Chap10 Generic Algorithms(未完)

时间:2019-09-20 14:07:09      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:效果   iterator   col   replace   cout   素数   替换   eric   ring   

大多数算法定义在头文件algorithm中,在头文件numeric中定义了数值泛型算法。

以find算法为例:在容器的两个迭代器指定的范围内遍历,查找特定值。

 1 int val=44; 2 auto result=find(ivec.begin(),ivec.end(),val); 3 cout<<result<<endl; 

迭代器令算法不依赖于容器,但算法依赖于元素类型的操作

算法不执行容器的操作,只会执行迭代器的操作

只读算法

  只会读取其范围之内的元素而不会改变元素

  除了find算法之外,例如accumulate算法(定义在numeric头文件中),返回范围内元素之和+指定初值

    cin>>sum;

    accumulate(ivec.cbegin(),ivec.cend(),sum);(如果是string类型,则是将string连接起来)

  对于只读算法,最好选取cbegin和cend作为迭代器

  再举操作两个序列的算法equal为例:(如果两个序列所有对应元素相同,则返回true,否则返回false)

    equal(ivec1.cbegin(),ivec1.cend(),ivec2.cbegin());

  equal算法并不要求两个序列元素类型严格一致,只要能用==比较即可

  基于此例,对于只给出第二个序列的单一迭代器的算法,都假定两序列等长(至少不能比第一个短)

写元素算法

  需要确保容器自身大小至少不小于写入的元素数目(因为算法不能改变容器大小)

    例如:fill(ivec.begin(),ivec.end(),val);将容器每个值赋为val

     fill_n(ivec.begin(),ivec.size(),val);将容器每个值赋为val

      注意:如果对空容器使用fill_n并且指定长度,会引起错误

  back_inserter(定义在iterator头文件)

    为了向容器尾部添加元素而使用的迭代器

     1 vector<int> ivec; 2 auto it =back_inserter(ivec); 3 *it=23; 

    这样在容器的尾部添加了一个元素,值为23

    结合fill_n使用:(添加了10个值为val的元素到ivec)

     1 vector<int> ivec; 2 fill_n(back_inserter(ivec),10,val); 

  拷贝算法:

       1 auto ret=copy(begin(arr1),end(arr1),arr2); 

    这样将arr1序列的值拷贝给arr2(要求arr2至少和arr1等长),返回end(arr2)

    类似copy算法,replace也具备此类替换效果:

     1 replace(ilst.begin(),ilst.end(),search_value,new_value); 

    这样将ilst序列中所有值为search_value的元素赋值为new_value

    如果不想将原序列改变,可以将元素替换后的序列保存在其他容器中:

     1 replace_copy(ilst.begin(),ilst.end(),back_inserter(ivec),search_value,new_value);

    这样借助replace_copy函数和back_inserter将新的ilst保存在ivec中,原本的ilst不变

重排元素算法: 

  

 

C++Primer 5th Chap10 Generic Algorithms(未完)

标签:效果   iterator   col   replace   cout   素数   替换   eric   ring   

原文地址:https://www.cnblogs.com/hfut-freshguy/p/11556707.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!