标签:效果 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