STL函数对象2

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
看下面的例子:
class IntSequence {
private:
int value;
public:
IntSequence (int initialValue): value(initialValue) {}
int operator() () {return value++;}
};
list<int> coll;
generate_n (back_inserter(coll),9, IntSequence (1)); 
PRINT_ELEMENTS(coll);
Output:
1 2 3 4 5 6 7 8 9

有时候我们想保存函数对象的状态,像上面的例子函数对象是按值传递的,如果下次再次用到还是函数对象的初始状态:
有两种方法解决:
1.       传递函数对象的引用而非值
2.       用for_each()函数。

看这样一个例子:函数上面的函数对象IntSequence。
主函数中:
list<int> coll;
IntSequence seq(1);
generate_n<back_insert_iterator<list<int> >,int, IntSequence&>(back_inserter(coll),4.Seq);
PRINT_ELEMENTS(coll);
generate_n (back_inserter(coll), 4, IntSequence (42)) ;
PRINT_ELEMENTS(coll);
generate_n (back_inserter(coll), 4, seq) ;
PRINT_ELEMENTS(coll);
Output:
1 2 3 4
1 2 3 4 42 43 44 45
1 2 3 4 42 43 44 45 5 6 7 8
这样就可以保存函数对象的状态。

对于For_each函数它可以把函数对象返回出来。
class MeanValue {
private:
long num; //number of elements
long sum; //sum of all element values
public:
MeanValue() : num(0), sum(0) {}
void operator() (int elem) {num++;sum += elem; }
double value() {return static_cast<double>(sum) / static_cast<double>(num);}
}

vector<int> coll;
for (int i=1; i<=8; ++i) {coll.push_back(i);}
MeanValue mv = for_each (coll.begin(), coll.end(), MeanValue()); 
cout << "mean value: " << mv.value() << endl;
output:
mean value: 4.5



看下面一个有趣的例子:
class Nth { //function object that returns true for the nth call
private:
int nth; //call for which to return true
int count; //call counter
public:
Nth (int n) : nth (n), count (0) {}
bool operator() (int) {return ++count == nth;}
};
主程序:
list<int> coll;
for (int i=1; i<=9; ++i) {coll.push_back(i);}
PRINT_ELEMENTS(coll,"coll: ");

list<int>::iterator pos;
pos = remove_if (coll.begin(),coll.end(), Nth(3)), /
coll.erase (pos,coll.end());
PRINT_ELEMENTS (coll, "nth removed: ");
}
Output
coll: 1 2 3 4 5 6 7 8 9
nth removed: 1 2 4 5 7 8 9
为什么会产生这样的结果呢?这是因为在函数的执行中函数赋值了内部的断言,看下remove_if()定义:
template <class ForwIter, class Predicate>
ForwIter std::remove_if(ForwIter beg, ForwIter end,Predicate op){
beg = find_if(beg, end, op);
if (beg == end) {return beg;}
else {ForwIter next = beg;return remove_copy_if(++next, end, beg, op);}
}
这样就很清楚了,op按值传递给find_if,在再传递给remove_copy_if时还是原来的op,而是不是经过运行的OP。当然也有解决的方法。你可以重新remove_if()函数,像这样:
template <class ForwIter, class Predicate>
ForwIter std::remove_if(ForwIter beg, ForwIter end,Predicate op)
{
while (beg != end && !op(*beg)) {++beg;}
if (beg == end) {return beg;}
else {
ForwIter next = beg;
return remove_copy_if(++next, end, beg, op);
}
}
这样就解决了问题。
STL仿函数函数对象浅析 例如,一个很简单问题,求两个数中的较大数,用C++代码很好写,如下: int Max(const int num1, const int num2) { return num1 >= num2 ? num1 : num2; } 对于这种问题,如果你想把代码写的让人捉摸不透,怎么搞呢?那么就用STL仿函数functor来实现,也可以称之为函数对象,在struct或class内重载()操作符来实现,那么上面的代码可以改写成下面这种形式: struct Max... 阅读详情

相关推荐

利用STL算法来解决完数问题(count_if find_if)

题目描述 如果一个正整数的所有真因子(不含本身)之和等于自身,该正整数称为完数。本题要求利用STL容器保存输入的若干个正整数,并利用函数对象STL算法统计其中完数个数,如果有完数,输出第1个完数的序号和第一个完数,如果没有,输出none。本题要求使用STL算法。 输入描述 若干个正整数 输出描述 第1行输出完数个数 如果有完数,第2行输出第1个完数的序号和第一个完数,如果没有,第2行输出none...

qq_42818329的博客 421

STL函数对象

STL函数对象(Function Object)的用法和解析 最近看代码的时候看到了STL中的一个函数对象的用法,查阅了一些资料,也做了一些实验。下面整理了这些资料。

懒得打字 2144

C++ 容器及选用总结

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

weixin_30625691的博客 545

使用函数找出指定范围内的完数

程序填空,不要改变与输入输出有关的语句。 输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算: 输入两个正整数 m 和 n(1<=m,n<=1000),输出 m 到 n 之间的所有完数,完数就是因子和与它本身相等的数。 要求定义并调用函数 factorsum(number),它的功能是返回number的因子和,函数形参number的类型是整型,函数类型是整型。例

zmq1126的博客 1万+

stl学习笔记2(容器,函数对象

3 组件二:容器你可以生成STL容器,用来存放对象或者指向对象的指针。 class TMyClass;typedef list TMyClassList;     // 用于存放对象的list容器typedef list TMyClassPtrList; // 用于存放对象指针的list容器 如果容器是保存对象,则在容器析构的时候会自动清理这些对象。但,如果它保存的是对象

denny的专栏 1665

[C++]2022.2.10 STL-函数对象

函数对象 函数对象本质上是一个类,虽称作仿函数但不是真正的函数。 1.函数对象作为重载 ()函数调用操作符 的类,其对象被称为函数对象2.重载后的行为类似函数调用,又称为仿函数。 特性: 1.函数对象有自己的返回值和参数,可以像函数一样被调用。 2.函数对象作为一个类,能够有自己的状态(成员)。 3.函数对象可以作为参数传递 谓词 1.返回bool类型的仿函数即谓词。 2.根据仿函数接收的参数划分: 一个参数为一元谓词;二个参数为二元谓词。 3.谓词可以改变算法策略。 谓词..

easycome easygoing、 577

stl算法设计理念_预定义函数对象函数适配器2_案例

传智扫地僧课程学习笔记。 多看老师代码,多敲老师代码, class IsGreat { public: IsGreat(int i) { m_num = i; } bool operator()(int &num) { if (num > m_num) { return true; } return false; } private: int m

1 253

STL- 函数对象(仿函数)(eg:int operator()(int v1,int v2)), 谓词,内建函数对象

函数对象(仿函数)是一个,不是一个函数

weixin_62848630的博客 330

C++ Primer Plus学习笔记之STL函数对象

C++ Primer Plus学习笔记之STL函数对象 一,什么是函数对象 很多STL算法都使用函数对象(也叫函数符)。函数符是可以以函数方式与()结合使用的任意对象。 例如:for_each(v.begin(),v.end(),Display) 二,函数符的概念 1,生成器,不用参数就可以调用的函数2,一元函数,是用一个参数可以调用的函数符 3,二元函数,是用两个参数可以调

奋起的Coder。。。 1466

STL22 函数对象适配器之仿函数适配器 not1 not2

#include<iostream> #include<vector> #include<functional> #include<algorithm> using namespace std; //预定义函数对象: //②仿函数适配器 not1 not2 class MyCompare01{ //二元函数对象(二元谓词:返回值为bo...

piano_diano的博客 412

STL函数对象 内建函数 函数对象适配器

函数对象函数对象的概念谓词概念内建函数对象函数对象适配器 函数对象的概念 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行 为类似函数对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函 数那样调用。 注意: 1.函数对象(仿函数)是一个类,不是一个函数2.函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。 一元仿函数”(unary functor):重载的 operator()要求获取一个参数; 二元仿函数”(b

log_Li的博客 170

STL21 函数对象适配器之仿函数适配器 bind1st  bind2nd

#include<iostream> #include<vector> #include<functional> #include<algorithm> using namespace std; //预定义函数对象: //①仿函数适配器 bind1st bind2nd class MyPrint01{ //一元函数对象 ...

piano_diano的博客 307

STL(内建函数对象函数对象适配器 )

4.3 内建函数对象 STL内建了一些函数对象。分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。使用内建函数对象,需要引入头文件 #include<functional>。 6个算数类函数对象,除了negate是一元运算,其他都是二元运算。 template&l...

塞外听雪 442

C++ STL 基础及应用(7) 函数对象(仿函数)

函数作为对象是程序设计的新思维。STL 通过重载类中的 operator() 函数实现函数对象功能,不但可以对容器中的数据进行各种各样的操作,而且能够维护自己的状态。因此,与标准 C 库函数相比,函数对象更为通用。本章将介绍函数指针的使用、函数对象的定义、引入目的、使用方法,C++98 标准和C++11标准下 STL 内置函数对象的详细介绍、适配器类的使用。包括 bind1st bind2nd not1 not2 mem_fun mem_fun_ref ptr_fun bind ref cref 的使用。

?.?的专栏 3681

STL算法 ——函数对象(仿函数)【仿函数、谓词、内建函数对象、适配器】

/ x op value,即 10 greater elem,10 > elem,小于10的元素。// x op value,即 10 less elem,10 < elem,大于10的元素。// value op x,即 elem less 10,elem < 10,小于10的元素。//sort(v.begin(), v.end())//默认升序,如想要降序,就要增加排序规则。他们的申明是一样的,都是(const Operation& op, const T& x);greater();...

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 481

STL中伪函数函数对象(functor)初步理解(下)

好了,有了以上理论知识,就可以探讨一下函数对象的用法了,接下来我会以STL中使用最频繁的for_each做例子,来说明函数对象的原理和作用。 先查一下for_each的用法,在www.cplusplus.com上查到了比较详细的解释,原文如下: Apply function to range Applies function f to each of

Linuxtiger之家 3236

C++STL 预定义函数对象函数适配器

预定义函数对象函数适配器 预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象,#include <functional>必须包含。 1使用预定义函数对象: void main() { plus<int> intAdd; int x = 10; int y = 20; int z = intAdd(x, y); /...

Huadong_eddy的博客 382
上一篇: STL函数对象
下一篇: STL函数对象之预定义函数对象和函数对象绑定器
FlowShell
博客等级 码龄17年 119粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值