例如:假设有如下的代码:
class Employee
{
public:
int DoSomething(){}
}
std::vector<Employee> Emps;
假设我们要调用Emps里面所包含的所有Employee的DoSomething();一般初学者会这样调用:
for (std::vector<Employee>::iteror it=Emps.begin(); it!=Emps.Ends(); it++)
{
(*it).DoSomething();
}
而定义一个全局的仿函数,使用STL中的for_each的用法也是司空见惯的,如:
int GiveDoSomething(Employee& e)
{
return e.DoSomething();
}
std::for_each(emps.begin(),emps.end(),&GiveDoSomething);
但是这种访问方式需要单独定义一个全局的仿函数GiveDoSomething.而有没有办法直接调用Employee中对应的成员函数的话?答案是这样子:
std::vector<Employee> emps;
std::for_each(emps.begin(),emps.end(),std::mem_fun_ref(&Employee::DoSomething));
而倘若容器中包含的是指向对象的指针,你就应该使用mem_fun:
std::vector<Employee> emp_ptrs;
std::for_each(emp_ptrs.begin(),emp_ptrs.end(),std::mem_fun(&Employee::DoSomething));
不过有一点要注意,请看DoSomething函数是无参的,而对于有一个参数的函数,可以使用std::bind...辅助函数,使用原则和mem_fun一样。然而遗憾的是,这种做法不适应那些接受两个或多个参数的函数,但是这并不代表mem_fun一无用处。
但是mem_fun这些特质同样会带给我们一些尴尬的事情,例:
std::mem_fun(&(std::vector<int>::clear))
std::vector<int>::clear()的函数参数是无参的,返回void.这样调用会成功吗?
C++标准里面关于标准库的部分在描述某些成员函数的实现时故意留了一些余地。尤其是下面这两句话:
.一个具有默认参数的成员函数签名可以被“两个或多个具有等价行为的成员函数签名”所替代
.成员函数签名可以具有额外的默认参数
上面的第二句话就是问题所在,即那些可有可无,若隐若现的额外参数就是肇事者,Herb Sutter称之为(peekaboo(

STL中mem_fun和mem_fun_ref的用法的更多相关文章

  1. 【转】STL中mem_fun和mem_fun_ref的用法及区别

    原文:http://www.cppblog.com/mysileng/archive/2012/12/25/196615.html 引子: 怎么对容器中的所有对象都进行同一个操作?我们可能首先想到的是 ...

  2. STL中mem_fun与mem_fun_ref的区别[转]

    http://www.cnblogs.com/Purple_Xiapei/archive/2012/05/27/2520483.html STL中mem_fun和mem_fun_ref的用法 分类:  ...

  3. STL中mem_fun, mem_fun_ref用法

    1.引言 先看一个STL中for_each的用法: #include <iostream> #include <vector> #include <algorithm&g ...

  4. C++ mem_fun 和 mem_fun_ref 的用法

    假设我们有以下的一个类: 另外有一个包含 class A 对象的数组: vector<A> vec; 如何对每一个类的对象调用成员函数print. 做法1: 利用下标 for(int i= ...

  5. STL中find和sort的用法总结

    STL算法 STL 提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等. 许多算法操作的是容器上的一个区间(也可以是整个容器),因此需要两个参数,一个是区间起点元素的迭代器,另一 ...

  6. STL中map,set的基本用法示例

    本文主要是使用了STL中德map和set两个容器,使用了它们本身的一些功能函数(包括迭代器),介绍了它们的基本使用方式,是一个使用熟悉的过程. map的基本使用: #include "std ...

  7. c++中STL中的next_permutation函数基本用法

    对于next_permutation函数是针对于排列组合问题的库函数,它的排序方式是按照字典的方式排列的·: 如以下代码对于next_permutation函数的初步解释: #include<c ...

  8. C/C++-STL中lower_bound与upper_bound的用法以及cmp函数

    转载于:http://blog.csdn.net/tjpuacm/article/details/26389441 不加比较函数的情况: int a[]={0,1,2,2,3}; printf(&qu ...

  9. STL中map用法

    Map是 STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于 这个特性,它完成有可能在我们处理一对一数据的 ...

随机推荐

  1. mysql导出导入所有数据库

    导出所有数据库 mysqldump -uroot -p123456 --all-databases > /home/aa.sql 导入所有数据库 mysql -uroot -p123456 &l ...

  2. Hollis原创|不了解这12个语法糖,别说你会Java

    GitHub 2.5k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 2.5k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 2.5k Star 的 ...

  3. Redis单台的安装部署及集群部署

    Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(diff ...

  4. 关于海康视频采集卡的简介---基于pci的插潮采集卡

    vga 640x480 qvga vga的1/4,宽高分别是vga的一半 (1)采集类型 海康威视 DS-2CE16A2P-IT3P 700TVL 1/3" DIS ICR 红外防水筒型摄像 ...

  5. IOS --支付宝SDK 分解讲解

    开发在手机端的时候(客户端),我们主要负责客户端(手机端)的开发,所以那些繁琐的到支付宝官网填写商户信息可以留给后台去弄,后台只要把: 1回调地址, 2app的ID, 3商户的私钥(privateKe ...

  6. 10个迷惑新手的Cocoa&Objective-c开发问题

    本文转载至  http://blog.csdn.net/lvxiangan/article/details/27964733     language background run­time thre ...

  7. python 基础 1.5 python数据类型(四)--字典常用方法示例

    一. 字典 #字典 dict1 = {'name':'lzc','age':'20','sex':'man'} print dict1 print type(dict1) >>> { ...

  8. 【BZOJ2427】[HAOI2010]软件安装 Tarjan+树形背包

    [BZOJ2427][HAOI2010]软件安装 Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为 ...

  9. 计算机网络--DNS

    1.域名系统DNS(domain name system)是因特网使用的命名系统,用来把便于人们时用的机器名字转换为IP地址.因特网的域名系统DNS被设计成一个联机分布式数据库系统,并采用客户服务器方 ...

  10. 关于eclipse 插件的挂载

    学习java的时候,不喜欢myeclipse 这种插件,什么都准备好了,自己动手就少了,不利于自己学习,现在我就diy 自己选几个插件来用,基本上就是 eclipse 加上我自己要用的插件,插件的安装 ...