本项目GitHub:HuangCheng72/HCSTL: 我的STL实现 (github.com): https://github.com/HuangCheng72/HCSTL
进入正文。
for each是一种遍历数组或者链表或者各种集合的算法,实现简单,应用广泛。百度百科可以查到:“foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。” 它在Java中的实现有增强for循环语句,在C#中的实现有for_each语句,在C++ STL中,它也是一种算法,其作用是在遍历的同时执行一定的操作。
(资料图片)
下面我们就在 vector 中实现for_each遍历输出整个数组的数据,先默认数据全是POD类型数据,暂时不考虑non-POD类型数据。
vector.h:
这是非常简单的一个算法,很容易实现。
在main.cpp中测试一下:
那么,拓展到non-POD类型数据,该怎么做?
在我们的main.cpp里面,我们一直用来测试的myclass类,有一个getter函数,但是不是所有的类都有getter函数。而且,不能只是输出,用户可能还要进行其他的操作,实现其他的功能。
让for_each算法实现更多的功能,而不是只能输出,我们要让用户决定到底要对数据做什么。
在C语言中,让用户决定对数据做什么,我们可以用函数指针的方法。同样的数据,我们可以传入不同的函数指针,实现不一样的执行结果。在C++中这个方法也是适用的。
但是C++中,运算符可以重载这一特性,给了我们另一种实现的思路。
我们知道,在C语言和C++中,调用函数的方式一样,如下:
所以我们有一个思路,能不能在一个类或者结构体中,重载小括号(或者叫圆括号)运算符,让对象用起来像函数一样。这就是所谓的函数对象,也叫仿函数。以下就是一个仿函数的例子。
函数对象首先是一个对象,它具备类与对象对象的所有特点,函数对象的类可以有构造器,并且在构造函数对象的时候,可以用不同的值初始化,进而执行不同的行为,比起函数指针来它的代码可读性更好。以下是同一个函数对象类new出来的两个对象,同样参数可以输出不同的结果的例子。
而对于函数指针来说,这是不可能的,只要参数固定,结果必然是固定的。因此,函数对象比函数指针更加灵活。
我们使用函数对象来修改vector中for_each这一算法,就可以让for_each对数据实现更多的功能。
vector.h:
而后在main.cpp中,进行测试:
顺利运行,结果正确。
欢迎访问本项目的GitHub仓库,如果对您有帮助,麻烦给项目一个star,谢谢!
HuangCheng72/HCSTL: 我的STL实现 (github.com): https://github.com/HuangCheng72/HCSTL