aihot  2020-11-12 10:19:28  OpenCV |   查看评论   

三、 泛型算法

1,泛型算法大部分在algorithm头文件中,而还有一些算术算法,它们在头文件numeric中。

2,int sum=accumulate(vec.begin,vec.end(),42)。accumulate返回一对迭代器之间元素和。注意第三个参数是很重要的,一方面它指定了sum的类型,使该类型可以进行加法运算;另一方面限制了容器的类型必须与第三个参数类型保持一致或可以转换。得到的sum为第三个参数的类型。

3,find_first_of用于查找第二段范围里的对象在第一段范围里出现的第一个位置。

while (it=find_first_of(it,roster1.end,roster2.begin(),roster2.end())     !=roster1.end())

上面用来循环查找,roster2中的元素在roster1中出现的位置。find_first_of的两个范围内的对象,并不要求容器类型一致,只需要容器内的元素可以进行比较即可。

4,写入算法:

fill(vec.begin(),vec.end(),0):将一对迭代器范围内的值设置为第三个参数的值。

fill_n(vec.begin(),10,0):如果vec内元素小于10个时,这段代码将会出现问题。用插入迭代器可以解决fill_n(back_inserter(vec),10,0);

copy(ilst.begin(),ilist.end(),back_inserter(ivec))会将ilist内的元素复制到ivec中。

replace(ilst.begin(),ilst.end(),0,42):将ilst中所有值为0的元素全部值设为42.

replace_copy(ilst.begin(),ilst.end(),back_inserter(ivec),0,42):ilst没有发生变化,ivec将储存ilst的一份副本,其实值为0的都变为了42.

5,去重复、排序算法

char * arStr[] = { "the", "quick", "red", "fox", "jumps", "over", "the", "slow", "red", "turtle" }; vector<string> sVec(arStr, arStr + 10); sort(sVec.begin(), sVec.end()); vector<string>::iterator end_uniuqe = unique(sVec.begin(), sVec.end()); sVec.erase(end_uniuqe,sVec.end()); stable_sort(sVec.begin(), sVec.end(), isShorter); vector<string>::size_type len = count_if(sVec.begin(), sVec.end(), LongerThan6); bool isShorter(const string& s1, const string& s2) {     return s1.size() < s2.size(); } bool LongerThan6(const string& s) {     return s.size() >= 6; }

上面程序中,unique是一个去重复的函数,返回已经没有重复的序列最后一位下一个元素位置。

stable_sort可以保留重复元素开始的相对位置

7,插入迭代器:

front_inserter:调用push_front插入

back_inserter:调用push_back插入

inserter:调用insert插入

list<int            
          
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自C++的那些事:容器和泛型算法

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]