![]() |
1
13
这些不是函数,而是类(实际上是结构,但并不重要)。当您定义自己的二进制函数用于STL算法时,您将从这些类派生它们,以便自动获取所有typedef。 例如。
现在不需要手动为
C++ 11的更新:
作为C++ 11,新的
|
![]() |
2
7
基本上,他们提供了
新的阿法克
|
![]() |
3
6
有一个关于SGI STL文档的解释 Function Objects . 总之,一元函数和二元函数用于生成函数 适应性强 . 这允许它们与函数对象适配器一起使用,例如 unary_negate 。 |
![]() |
4
3
他们是什么?std::unary_function 和 std::binary_function 是用于创建适应性函数对象的基本结构。这个词 适应性强 意味着它们提供必要的typedef,以便与标准函数适配器(如 STD::NOT1 , STD::NOT2 , STD::宾得 , STD::BND2 。 当我需要使用它们的时候?每次需要将自定义函数对象与标准函数适配器一起使用时,都可以使用它们。 你有例子吗?让我们考虑一些例子(我知道,它们是人造的。从另一方面来说,我希望它们是相当描述性的)。 例1。 假设你想全部打印 串 在一个 矢量 其长度不小于特定阈值,并将其打印到 STD:: 。 可以使用下一个函数对象:
现在任务非常简单,可以由 STD::删除 算法:
如果您想使用相同的函数对象来打印 串 用它们的长度 严格地说 比门槛还高? 我们能想到的明显的解决方案是 STD::NOT1 功能适配器:
实际上,上面的代码不会编译,因为 长度阈值 不可适应并且没有必需的typedef STD::NOT1 。 为了使它具有适应性,我们需要继承自 STD::Unayle函数 :
现在,我们的第一个例子很有魅力。 例2。 让我们改变前面的例子。假设我们不想在函数对象中存储阈值。在这种情况下,我们可以将函数对象从一元谓词更改为二元谓词:
利用 STD::BND2 功能适配器:
C++ 11和高级怎么办?以上所有示例仅供有意使用 C++ 03 . 原因是 STD::Unayle函数 和 性传播疾病: 自以来已弃用 C++ 11 完全从 C++ 17 。 它是随着更广泛和更灵活的函数的出现而出现的,比如 std::bind 继承自 STD::Unayle函数 和 性传播疾病: 多余的。 |
![]() |
AstralHex · 矩阵乘法代码工作不正常 5 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 6 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 6 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 6 月前 |