C++ mem_fun 和 mem_fun_ref 的用法

假设我们有以下的一个类:

另外有一个包含 class A 对象的数组: vector<A> vec;

如何对每一个类的对象调用成员函数print.

做法1: 利用下标

for(int i=0; i<vec.size(); ++i) {
  vec[i].print();
}

做法2:利用迭代器

for(vector<int>::const_iterator it=vec.begin(); it!=vec.end(); ++it) {
  it->print();
}

做法3:C++11强大的 auto

for(auto x : vec) {
  x.print();
}

有了C++11以后,做法3其实代码已经非常短了,但是 effective STL 中的一个条款告诉我们,

用STL的算法优先于自己手写的循环。。比方说,这个问题就可以采用 for_each。。

原因如下:1. 效率: 算法通常比程序自己写的循环效率更高(STL库作者更加了解容器的底层实现,可以进行优化)

2. 正确性: 自己写循环更容易出错(代码越少,越不容易出错)

3. 可维护性:使用算法更为简洁明了

做法4: 采用for_each

但是下面的代码是否正确呢??

for_each(vec.begin(), vec.end(), &A::print); //无法通过编译

编译出错,因为 print 是成员函数。。如果是普通的函数则没有问题。。

for_each(vec.begin(), vec.end(), mem_fun_ref(&A::print));

如果是 vector<A*> 的话,就用 mem_fun即可。。

其实 mem_fun 和 mem_fun_ref 是两个模板函数,返回一个函数对象(包含上述的成员函数)。。

C++ mem_fun 和 mem_fun_ref 的用法,布布扣,bubuko.com

时间: 2024-10-29 10:46:21

C++ mem_fun 和 mem_fun_ref 的用法的相关文章

STL中mem_fun和mem_fun_ref的用法

怎么对容器中的所有对象都进行同一个操作?我们可能首先想到的是用循环来实现.    比如有如下的一个类: class ClxECS{public:    int DoSomething()     {         // 这里以输出一句话来代替具体的操作        cout << "Output from method DoSomething!" << endl;         return 0;     };}; 现在定义如下一个vector: vect

STL中mem_fun与mem_fun_ref的区别[转]

http://www.cnblogs.com/Purple_Xiapei/archive/2012/05/27/2520483.html STL中mem_fun和mem_fun_ref的用法 分类: C++2006-11-21 09:11 5244人阅读 评论(8) 收藏 举报 怎么对容器中的所有对象都进行同一个操作?我们可能首先想到的是用循环来实现.    比如有如下的一个类: class ClxECS{public:    int DoSomething()     {         //

mem_fun与mem_fun_ref的区别

一句话:container<ClassType*>就用mem_fun,container<ClassType>就用mem_fun_ref 参考: http://www.cplusplus.com/reference/functional/mem_fun/ http://www.cplusplus.com/reference/functional/mem_fun_ref/ 其实这里的本质可以看这篇随笔: http://www.cnblogs.com/qrlozte/p/4453786

c++11-bind的用法

bind函数 在c++11之前,要绑定某个函数.函数对象或者成员函数的不同参数值需要用到不同的转换器,如bind1st.bind2nd.fun_ptr.mem_fun和mem_fun_ref等.在c++11中,绑定参数的方法得以简化.c++11提供了"一站式"绑定模板bind,其用法为: #include <functional> std::bind(待绑定的函数对象/函数指针/成员函数指针,参数绑定值1,参数绑定值2,...,参数绑定值n); bind的第一个参数是待绑定

Effective STL 中文版(大全)

Effective STL 中文版(大全) 作者:winter 候捷说,对于STL,程序员有三个境界,开始是使用STL,然后是理解STL,最后是补充STL.Effective STL是一本非常好的书,帮助你更好的理解STL,其作者就是<Effective C++>一书的作者.如果你已经初步了解了STL的容器.迭代器.算法和函数,而又想更好的了解STL,那么<Effective STL>是你的最佳选择. 还有一部分没有找到链接,如果再找不到我会自己试着翻译一下:) 前言 容器 条款1

Effective C++ —— 杂项讨论(九)

条款53 : 不要轻忽编译器的警告 请记住: 1. 严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉. 2. 不要过度倚赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同.一旦移植到另一个编译器上,你原本倚赖的警告信息有可能消失.  条款54 : 让自己熟悉包括TR1在内的标准程序库 TR1代表“Technical Report 1”,TR1宣示了一个新版C++的来临,我们可能称之为Standard C++1.1.不熟悉TR1机能而却奢望成

C++函数配接器

一.概述 配接器(adaptor)在STL组件的灵活运用功能上,扮演着轴承.转换器的角色,将一种容器或迭代器装换或封装成另一种容器或迭代器.adaptor这个概念,实际上是一种设计模式,其定义如下: 将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作. 配接器按功能可以分为如下3类: 可以改变函数或仿函数接口的适配器,称为仿函数适配器: 针对容器的适配器,称为容器适配器: 针对迭代器的适配器,称为迭代器适配器. 本博客只介绍仿函数适配器

C++ 容器一些细节

参考:http://www.cnblogs.com/answeryi/archive/2011/12/16/2289811.html: 目录 ==================================================== 第一章 容器 第二章 Vector和string 第三章 关联容器 第四章 迭代器 第五章 算法 第六章 函数 第七章 在程序中使用STL ==================================================== 第1章

c++容器使用总结(转载)

目录 ==================================================== 第一章 容器 第二章 Vector和string 第三章 关联容器 第四章 迭代器 第五章 算法 第六章 函数 第七章 在程序中使用STL ==================================================== 第1章 容器 第1条:慎重选择容器类型. 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.