由于find运算时基于迭代器的,因此可在任意的容器中使用像同的覅俺的函数
例如:vector<int >::iterator result=find(vec.begin,vec.end,search_value)
list<int >::iterator result=find(lst.begin,lst.end,search_value);
由于指针的行为与作用在啊内置数组上的迭代器一样,因此也可以使用find来搜索数组:
int ia[5]={1,3,4,5,6};
int search=5;
int *result=find(ia,ia+5,search_value);
算法是如何工作的:
每个泛型算法的实现都独立于单独的容器,从概念上看find函数必须包含以下步骤:
1)顺序检查每个元素,
2)如果当前的元素等于要查找的值,那么返回只想该元素的迭代器。
3)否则,检查下一个元素,重复步骤2,直到找到这个值,或检查完所有的元素为止。
4)如果已经到达集合末尾,而且还未找到该值则返回某个值,知名要查找的值不在集合中。
使用泛型算法必须包含头文件algorithm头文件。
标准库还定义了一组泛化的算术算法,其命名习惯于泛型算法形同,使用这些算法必须包含numric头文件。
除了少数例外,所有算法都在一段范围内的元素上操作,我们将这段范围陈伟“输入范围”,带有输入范围参数的算法,总是使用头两个形参标记该范围,
1.。只读算法:
除了find之外,另一个简单的只读算法是accumulate,该算法在numeric头文件中定义。
int sum=accumulate(vec.begin().vec.end(),42);
accumulate第三个参数是累加的初值,该函数将它的一个内部变量设置为指定的初值,然后在此基础上累加输入范围内所有元素的值,accumulate算法返回累加的结果,其返回类型就是其第三个实参的类型。
考虑下面的例子,可以使用accumulate吧string类型的vector容器中的元素连接起来
string sum=accumulate(vec.begin().vec.end(),string(""));
注意:程序显式的创建一个string对象,用作该函数调用的第三个实参,传递一个字符串字面值,将会导致变异是错误,因为此时累加和的类型将是const char*。而string的加法操作符,所使用的主要做数则分别是string和const char*类型、
令:find_fist_of
2.。写容器元素的算法。
写入到输入序列的一个简单算法是fill算法
fill(vec.begin().vec.end());//重设每一个元素为0;
fill(vec.begin(),vec.begin()+vec.size()/2,10);//
执行时,将该范围内的每个元素都设为给定的值。
另外一个函数是:
fill_n(iterator,n,value);
该函数从迭代器指向的元素开始,将制定数量的元素设置为给定的值,初学者常犯的错误是:在没有元素的空容器上调用fill_n函数。
vevtor vec;
fil_n(vec.begin(),10,9);//灾难性错误,vec是空容器,却要求往里面写10个9;从bigin开始写。
引入back_inserter
vector<int>vec;
fill_n(back_inserter(vec),10,9);
现在fill_n函数每写入一个值,都会通过back_inserter生成的插入迭代器实现,效果相当于在vec上调用push_back ,在vec末尾添加10个元素,每个元素都是9.
写入到目标迭代器的算法;
第三类算法是想目标迭代器写入未知个数的元素。这类算法最简单的是copy函数
vector<int>ivec;
copy(ilst.begin(),ilist.end(),back_inserter(vec));
从输入范围中读取元素,然后将他们复制给目标ivec;
当然这个例子的效率比较差。通常如果要以一个已存在的容器为副本创建新容器,更好的方法是直接用输入范围作为新构造容器的初始值。
vector<int> ivec(ilst.begin(),ilst.end());
replace(ilst.begin(),ilst.end(),0,42);//调用将所有为0 的实例替换成42
replace_copy(ilst.begin(),ilst.end(),back_inserter(ivec),0,42)//调用该函数后,ilst没有改变,ivec存储ilst的一个副本,而ilst内所有的0 在vec中都变成了42;
注意这俩个函数的区别
分享到:
相关推荐
这些是关于c++ primer的练习题和 测试题 ,自己感觉还不错 大家可以看看
因为这部分操作可以抽象出来为所有的容器工作,那就是泛型算法。所谓“泛型”是指这些算法可以应用于多种容器类型上,而容器内的元素类型也可以多样化。标准库提供了100多个泛型算法,主要定义于头文件中,还有一组...
泛型算法.CHM(已经编译的帮助文档),对C++很有帮助,文档小,方便
C++实验4关联容器、泛型算法.doc
以下是对C++中的泛型算法进行了总结介绍。需要的朋友可以过来参考下
C++设计新思维:泛型编程与设计模式之应用.pdf 带目录书签
设计新思维泛型编程与设计模式之应用 不学习泛型觉得自己没学过c++, 不学设计模式觉得自己没有学过面向对象编程
C++Primer第11章-泛型算法-课后习题答案[收集].pdf
GP-泛型算法通用原则
C++ primer之泛型函数
c++ json读写文件,可扩展接口 使用只需要引用头文件即可,泛型接口,操作简单,可用于配置文件读写
泛型算法与Function Objects,繁体中文版,介绍C++开发过程中,STL与TyptTraits等技术,值得一看。
主要介绍了C++算法与泛型算法(algorithm、numeric),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
泛型演算法Generic Algorithms與Function Objects.zip
C++设计新思维:泛型编程与设计模式之应用
C++ 设计新思维泛型编程与设计模式之应用代码自动生成理论现在正高速发展着。
C++ Primer(第五版)|练习题答案与解析(第十章:泛型算法) 本博客主要记录C++ Primer(第五版)中的练习题答案与解析。 参考:C++ Primer C++ Primer 练习题10.1 头文件algorithm中定义了一个名为count的函数,它类似find...
C++的基础知识 STL 模版相应深入讲解 泛型编程介绍