ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-09-20 13:57:38  阅读:276  来源: 互联网

标签:ivec val 容器 Generic 5th 元素 ilst C++ 算法


大多数算法定义在头文件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不变

重排元素算法: 

  

 

标签:ivec,val,容器,Generic,5th,元素,ilst,C++,算法
来源: https://www.cnblogs.com/hfut-freshguy/p/11556707.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有