STL中mem_fun和mem_fun_ref的用法
例如:假设有如下的代码:
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的用法的更多相关文章
- 【转】STL中mem_fun和mem_fun_ref的用法及区别
原文:http://www.cppblog.com/mysileng/archive/2012/12/25/196615.html 引子: 怎么对容器中的所有对象都进行同一个操作?我们可能首先想到的是 ...
- STL中mem_fun与mem_fun_ref的区别[转]
http://www.cnblogs.com/Purple_Xiapei/archive/2012/05/27/2520483.html STL中mem_fun和mem_fun_ref的用法 分类: ...
- STL中mem_fun, mem_fun_ref用法
1.引言 先看一个STL中for_each的用法: #include <iostream> #include <vector> #include <algorithm&g ...
- C++ mem_fun 和 mem_fun_ref 的用法
假设我们有以下的一个类: 另外有一个包含 class A 对象的数组: vector<A> vec; 如何对每一个类的对象调用成员函数print. 做法1: 利用下标 for(int i= ...
- STL中find和sort的用法总结
STL算法 STL 提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等. 许多算法操作的是容器上的一个区间(也可以是整个容器),因此需要两个参数,一个是区间起点元素的迭代器,另一 ...
- STL中map,set的基本用法示例
本文主要是使用了STL中德map和set两个容器,使用了它们本身的一些功能函数(包括迭代器),介绍了它们的基本使用方式,是一个使用熟悉的过程. map的基本使用: #include "std ...
- c++中STL中的next_permutation函数基本用法
对于next_permutation函数是针对于排列组合问题的库函数,它的排序方式是按照字典的方式排列的·: 如以下代码对于next_permutation函数的初步解释: #include<c ...
- 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 ...
- STL中map用法
Map是 STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于 这个特性,它完成有可能在我们处理一对一数据的 ...
随机推荐
- java中的值传递和引用传递区别
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...
- 在 Selenium 中让 PhantomJS 执行它的 API
from selenium import webdriver driver = webdriver.PhantomJS() script = "var page = this; page.o ...
- 用Squid和DNSPod打造自己的CDN详细教程
本篇教程是顺应大家的要求而写.教程内大部分都是奶罩在为VeryCD等大型网站构建CDN时所累积的经验.在一些概念方面可能会有一些错漏,希望 大家指正. 本教程面对的对象是个人站长,所以各方面会力求傻瓜 ...
- ejabberd日志分析客户端登录流程
通过ejabberd的日志,整理了下客户端登录流程. 1. 通过TCP连接5222端口的流程: (1) 客户端向服务器发送stream流 <stream:stream to="nba. ...
- php中的字符串和正則表達式
一.字符串类型的特点 1.PHP是弱类型语言,其它数据类型一般都能够直接应用于字符串函数操作. 1: <? php 2: echo substr("123456",2,4); ...
- 高速修复汉澳sinox命令解释程序bash shell漏洞
bash是linux默认命令行管理程序shell.汉澳 sinox也安装有,尽管sinox并没有默认使用bash.可是用户一旦使用就会可能被通过漏洞入侵,所以必须高速修复.尽管sinox使用freeb ...
- hdu 5538 House Building(长春现场赛——水题)
题目链接:acm.hdu.edu.cn/showproblem.php?pid=5538 House Building Time Limit: 2000/1000 MS (Java/Others) ...
- CAS实现单点登录理解
CAS 是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO ),CAS 开始于 2001 年, 并在 2004 年 12 月 ...
- Linux 命令汇总总结相关
玩了linux快一年,简单总结下网络相关的命令,具体每个命令的参数可以用到再细看. 1.ifconfig:查询.设置网卡和IP网段等相关参数,包括MTU.2.ifup.ifdown:这两个命令就是一个 ...
- 【题解】cycle
[题解]cycle 题目描述 给定一个无向图,求一个环,使得环内边权\(\div\)环内点数最大. 数据范围 \(n \le 5000\) \(m\le 10000\) \(Solution\) 考虑 ...