STL中仿函数(functors)、类成员和mem_fun的使用

众所周知,STL使用起来非常方便,其中仿函数(functor)扮演了一个非常重要的角色。灵活运用仿函数的使用对于发挥STL强大功能非常关键。本文详细介绍了如何使用mem_fun和mem_fun1来绑定类成员函数,使之成为functor

什么是仿函数?就是一个重载了"()"运算符的struct,例如:

struct print_obj{
  void operator(int a)const{
     cout<<a<<endl;
  }
};

在STL的许多算法(algorithm)中都需要使用functor. 如:for_each. 同样在关联容器中也需要使用functor, 如map, set等。经常在使用STL算法的时候,经常需要把仿函数和类联系在一起,如果可以直接使用类的成员函数作为仿函数,那就方便多了。mem_fun的功能就是如此。

先看个简单的例子:

struct D {
 D(int i=0){num=i;}
 int num;
};
struct print_D{
 void operator()(const D* d)const{
   cout<<"I am D. my num="<<d->num<<endl;
  }
};
  
int main()
{
 vector<D*> V;
 V.push_back(new D(1));
 V.push_back(new D(2));
 V.push_back(new D);
 V.push_back(new D(3));
 for_each(V.begin(), V.end(), print_D());
}

编译输出:

I am D. my num=1
I am D. my num=2
I am D. my num=0
I am D. my num=3

时间: 2024-10-12 03:51:30

STL中仿函数(functors)、类成员和mem_fun的使用的相关文章

[经典面试题][百度]c++实现STL中的string类

题目 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能. 代码 /*------------------------------------- * 日期:2015-03-31 * 作者:SJF0115 * 题目: 实现string类 * 来源:百度 * 博客: ------------------------------------*/ #include <iostream> #include <cstring> us

编写一个STL中的CString类

STL英文是Standard Template Library,也就是我们常说的C++标准模板库,.该标准库于1998年被正式纳入C++标准,给全世界的C++程序员带来了福音.最让我们兴奋的应该是它的跨平台性,使得你在WINDOW,UNIX ,LINUX等操作系统上面用标准C++编写的程序不用修改即可移植.(当然要有C++的编译器). 现在的编译器虽然对标准C++支持程度不同,单总体上还是很好.WINDOWS平台的VC ,BC,Linux/UNIX平台的g++都是一流的编译器,都支持STL.而且

解析C++中派生的概念以及派生类成员的访问属性_C 语言

C++继承与派生的概念.什么是继承和派生 在C++中可重用性是通过继承(inheritance)这一机制来实现的.因此,继承是C++的一个重要组成部分. 前面介绍了类,一个类中包含了若干数据成员和成员函数.在不同的类中,数据成员和成员函数是不相同的.但有时两个类的内容基本相同或有一部分相同,例如巳声明了学生基本数据的类Student: class Student { public: void display( ) //对成员函数display的定义 { cout<<"num: &qu

学习AS3:delete关键字和类成员

关键字 delete关键字在Flash中是用来删除定义的变量,但是并不将对象从内存中清除掉(这是垃圾收集器的工作).它只是将一个变量的引用设置成无效,让内存中的这个对象无法再被引用和使用,也无法再使用for in来枚举. 事实上,垃圾处理器(GC)将在特定的时候,自动的从内存中删除那些不再被引用和使用的变量.比如,你创建了两个对象引用A和B,都指向了对对象ObjectX的引用,如果delete了A,并不会让垃圾收集器把ObjectX从内存中删除,因为B的引用还是指向了这个对象.如果将A和B都de

PHP中如何定义类及其成员属性与操作

 类的概念:类是具有相同属性和操作的一组对象的集合.它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和操作两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和操作说明两个主要部分. 1.类的定义: i. 类的关键字定义使用class 1.定义一个空类 Class Person{}; 2.定义一个有成员属性和操作的类 Class Person{ 成员属性........ 操    作........ } 3.定义一个不能被继承的类,使用final

初始化C++类成员和在你的MFC应用中加入位置栏

问题 我的问题是关于初始化C++类成员的.我见过许多这样的代码(包括在你的栏目中也见到过): CSomeClass::CSomeClass() { x=0; y=1; } 而在别的什么地方则写成下面的样子: CSomeClass::CSomeClass() : x(0), y(1) { } 我的一些程序员朋友说第二种方法比较好,但他们都不知道为什么是这样.你能告诉我这两种类成员初始化方法的区别吗? 回答 从技术上说,你的程序员朋友是对的,但是在大多数情况下,两者实际上没有区别.有两个原因使得我们

C++中static类成员

static局部变量 static局部变量确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化 这种对象一旦被创建,在程序结束前不会被撤销.在该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值. #include<iostream> #include<string> #include<assert.h> using namespace std; size_t count_calls() { static size_t ctr=0; return ++

python中如何对类的成员函数开启线程?

问题描述 python中如何对类的成员函数开启线程? 单独对某个函数开启线程是可以的,比如下面的代码: import threading import thread import time def doWaiting(): print 'start waiting:', time.strftime('%H:%M:%S') time.sleep(3) print 'stop waiting', time.strftime('%H:%M:%S') thread1 = threading.Thread

wcf-WCF中数据契约类包含数组成员时客户端报错,怎么解决

问题描述 WCF中数据契约类包含数组成员时客户端报错,怎么解决 WCF中数据契约类包含数组成员时客户端报错,怎么办呢?这个声明为数据契约的类是当成返回值传给客户端的,当数组成员赋值为null的时候客户端能正确接收到数据,但是当给这个数组成员赋予一个数组时客户端就不能读取这个返回的数据了.有高手有类似经验吗?望不啬赐教啊,很急 解决方案 你的数组元素的类型是什么,你的详细报错信息是什么 参考https://social.microsoft.com/Forums/nl-NL/da8c4e56-0a5