标准库中for_each是函数模板其中有一个是有三个参数,前两个参数提供要遍历容器的范围,最后一个是函数对象可以获取到遍历容器时的每个结果,这个函数对象
可以操作容器内元素(表象)。
先来看看这个模板(标准库文件定义的摘取)
template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{
for (; first != last; ++first) {
f(*first);///对每次遍历结果都会调用函数对象
}
return f;
}
举个例子这样会很直观了解它的用法。正如我们注释所以我们有两步操作
1.创建可调用对象,给出操作方式
2.实例化模板进行调用
struct PrintData {
PrintData() {
qDebug() << "contruct";
}
///【1】重载() 供for_each使用
void operator() (int& a){
a++;
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<int> li;
li << 9 << 8 << 7 << 6 << 5;
std::for_each(li.begin(), li.end(), PrintData());///【2】实例化模板,参数三是一个可调用局部函数对象
return a.exec();
}
接下来来说一下范围for语句。下面是语法 下边:后边必须是一个序列。与上边的for_each、c#的foreach 语句用法很像。
for(auto a : li) {
qDebug() << a;
}
最后总结一下,实际我们可以使用迭代器对容器进行遍历更加方便。这里更多的是探索一下std的巧妙思想吧。