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 的用法的更多相关文章
- 【转】STL中mem_fun和mem_fun_ref的用法及区别
原文:http://www.cppblog.com/mysileng/archive/2012/12/25/196615.html 引子: 怎么对容器中的所有对象都进行同一个操作?我们可能首先想到的是 ...
- STL中mem_fun和mem_fun_ref的用法
例如:假设有如下的代码: class Employee { public: int DoSomething(){} } std::vector<Employee> Emps; 假设我们要调 ...
- STL中mem_fun与mem_fun_ref的区别[转]
http://www.cnblogs.com/Purple_Xiapei/archive/2012/05/27/2520483.html STL中mem_fun和mem_fun_ref的用法 分类: ...
- mem_fun与mem_fun_ref的区别
一句话:container<ClassType*>就用mem_fun,container<ClassType>就用mem_fun_ref 参考: http://www.cplu ...
- STL中mem_fun, mem_fun_ref用法
1.引言 先看一个STL中for_each的用法: #include <iostream> #include <vector> #include <algorithm&g ...
- c++11-bind的用法
bind函数 在c++11之前,要绑定某个函数.函数对象或者成员函数的不同参数值需要用到不同的转换器,如bind1st.bind2nd.fun_ptr.mem_fun和mem_fun_ref等.在c+ ...
- STL用法大全
1. 概述 泛型编程思想最早缘于A.Stepanov提出的部分算法可独立于数据结构的论断.20世纪90年代初A.Stepanov和Meng Lee根据泛型编程的理论用C++共同编写了STL.但直 ...
- Bjarne Stroustrup对C++程序员的忠告
转自:http://blog.csdn.net/adm_qxx/archive/2007/05/20/1617488.aspx 第1章 致读者 [1] 在编写程序时,你是在为你针对某个问题的解决方 ...
- Effective STL 中文版(大全)
Effective STL 中文版(大全) 作者:winter 候捷说,对于STL,程序员有三个境界,开始是使用STL,然后是理解STL,最后是补充STL.Effective STL是一本非常好的书, ...
随机推荐
- 获取sql server数据库表结构
if exists (select 1 from sysobjects where name = 'sysproperties'and xtype = 'V')begin DROP VIEW s ...
- C++对于大型图片的加载缩放尝试
Qt对于图片的操作主要集中在这几个类 QImage ,QImageReader ,QPixmap 其中QImage这个类对图片的缩放有几个很不错的技巧,不过对于大图片却并不好使,当我们去看QImage ...
- PHP之OOP要点摘要
类和对象: 类是生成对象的模板,对象是活动组件; 面向对象编程实际操作都是通过类的实例(而不是类本身)完成的: 访问控制(public.protected.private):(1) ...
- ShellExecute调用另外一个进程(demo为一个控制led的一段代码)
public enum ShowCommands : int { SW_HIDE = 0, SW_SHOWNORMAL = 1, ...
- [原创]C#应用WindowsApi实现查找\枚举(FindWindow、EnumChildWindows)窗体控件,并发送消息。
首先介绍基本WindowsApi: public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 函 ...
- ExtJs 进度条(轮询)
客户端代码: Ext.onReady(function () { Ext.get('mb').on('click', function () { Ext.Ajax.request({ url: roo ...
- linux操作系统基础
计算机概述 1.计算机接收用户输入指令数据,经过cpu数据与逻辑单元运算处理后,产生或储存成有用的信息--->I/O设备+cpu+处理信息=计算机. 2.计算机五大单元:I/O单元 内存单元 c ...
- 使用Runtime.getRuntime().exec()在java中调用python脚本
举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...
- 模具厂MES项目介绍
开发工具:Microsoft Visual Studio 2012 数据库: Oracle 开发语言:C#(4.0) 版本控制工具:TortoiseSVN 底层ORM框架:IBatisNet ...
- SpringMVC 视图和视图解析器&表单标签
视图和视图解析器 请求处理方法执行完成后,最终返回一个 ModelAndView 对象.对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它 ...