VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1068|回复: 10

[原创] STL 名词解释

[复制链接]
79_avatar_middle
在线会员 发表于 2016-10-23 12:29:25 | 显示全部楼层 |阅读模式
所谓仿函数,function object,另名functor,是一个定义了operator()的对象,例如:
FunctionObjectType fo;
...
fo(...);
其中表达式fo()是调用仿函数fo的operator()。你可以将仿函数看成一般的函数。仿函数有三大好处:
1。仿函数拥有自己的状态。你可以同时拥有多个状态不同的实体。
2。仿函数可以写为class template,从而指定某种行为模式。
3。执行速度上,仿函数通常比函数指针更快。

所谓“函数配接器”function adaptor,是指能够将仿函数和另外一个仿函数或函数结合起来的仿函数。
例如:
find_if(coll.begin(),coll.begin(), bind2nd(greater<int>(),42));
其中的表达式 bind2(greater<int>(),42)就是一个组合型仿函数,检查某个int值是否大于42。实际上bind2nd是将一个二元仿函数转化为一元仿函数。

------------------------------------------------------------------------------

一 iterator

stl中算法通过iterator作用于数据的线性区间(linear range).

iterator是类似于指针的东东.它有几种不同的类型(不是C++语言中的类型,是一种concept(约定)),分别提供各种层次的功能,以满足不同算法的需要.
比如:

input iterator
支持:
== * ++
不支持:
= -- > <
mutlipass(多次历遍)
同时拥有两个input iterator(不知道术语是什么,望大侠赐教)

等等,可以参见<泛形编程与STL>.

iterator_traits是用来定义iterator的指向物的数据类型的(听说0x标准会增加typeof,有了typeof是不是可以简化一下???who can tell me?).

iterator_traits中还有一项iterator_category,是一个空类的typedef,用来标识iterator的类型(如input iterator).
可以配合函数的重载,针对不同类型的iterator,写其最有效率的算法.



   二 函数对象(function object)

"羊吃草"可以理解"将羊这个函数对象 通过吃这种算法 作用于草这个区间".
function object相当于羊,通过替换function object为牛,马,我们可以实现不同的目的(比如羊吃草是为了产毛,牛吃草是为了耕地,马吃草为了赶路).

function object中有一类叫做adaptable function object,它们作用类似iterator_traits,不过没有单独写成一个object.他们通过了自身参数和返回值的typedef.
可以用于function object adapter中,比如一个作用类似于"!"(not)的function object adapter.
stl中通过adaptable function object的基类,以方便使用.

刚看到这里,下次继续...................
-----------------------------------------------

1.Function object Adaptor?

    Adaptors are template classes that provide interface mappings.
    基于其他类来实现新的功能,成员函数可以被添加、隐藏,也可合并以得到新的功能。
    STL中的算法和容器一般都需要函数对象(function object)作为参数。如果想用到常用的C++函数时,可以用ptr_fun把普通函数转换成函数对象。比如ptr_fun(strcmp)就把常用的串比较函数strcmp包装成一个函数对象,就可用在STL算法和容器中了。
--------------------------------------------------------
2.bind1st和bind2nd?

    作用:简称为bind函数,可以将一些值限定在指定区间中。取得一个object中的value作为上限和下限。
    比较的时候所写的表达式像 x > k ,x < k,这里的k是一个参数表示你程序里面的表达式要和k值去比较。上面这两个表达式对应的应该是bind2nd ,简单的理解就是把k作为比较表达式的第二个参数。如果使用bind1st则对应的表达式是 k > x,k < x,也就是把k作为比较表达式的第一个参数。

    例如:
int a[] = {1, 2, 100, 200};

std::vector< int> arr(a, a + 4);

// 移除所有小于100的元素
arr.erase( std::remove_if( arr.begin(), arr.end(),
    std::bind2nd( std::less< int>(), 100)), arr.end());

这里的比较表达式相当于arr. < 100

如果用bind1st则表达的意思就恰恰相反

// 移除所有大于100的元素
arr.erase( std::remove_if( arr.begin(), arr.end(),
    std::bind1st( std::less< int>(), 100)), arr.end());

这里的表达式相当于100 < arr.

当然为了实现删除大于100的元素你同样可以使用bind2nd

// 移除所有大于100的元素
arr.erase( std::remove_if( arr.begin(), arr.end(),
    std::bind2nd( std::greater< int>(), 100)), arr.end());



---Sava
---------------------------------------------------------------

bind1st bind2nd的使用2007-3-19 14:08:00以前在使用stl的过程中发现bind1st和bind2nd这两个函数,当时不太理解什么意思,今天在网上查了一下相关资料发现竟然很简单,下面我就具体解释一下他们的用法。
        bind1st和bind2nd函数用于将一个二元算子(binary functor,bf)转换成一元算子(unary functor,uf)。为了达到这个目的,它们需要两个参数:要转换的bf和一个值(v)。

         可能这么解释以后大家还不是很清楚,那么就说点白话吧。我们在做比较的时候所写的表达式像 x > k ,x < k,这里的k是一个参数表示你程序里面的表达式要和k值去比较。上面这两个表达式对应的应该是bind2nd ,简单的理解就是把k作为比较表达式的第二个参数。如果使用bind1st则对应的表达式是 k > x,k < x,也就是把k作为比较表达式的第一个参数。大家可能会注意到这里面没有=的比较,先别着急,后面将会说道如何实现=的比较。先举两个例子看看bind1st和bind2nd的用法。

int a[] = {1, 2, 100, 200};

std::vector< int> arr(a, a + 4);

// 移除所有小于100的元素
arr.erase( std::remove_if( arr.begin(), arr.end(),
     std::bind2nd( std::less< int>(), 100)), arr.end());

这里的比较表达式相当于arr. < 100

如果用bind1st则表达的意思就恰恰相反

// 移除所有大于100的元素
arr.erase( std::remove_if( arr.begin(), arr.end(),
     std::bind1st( std::less< int>(), 100)), arr.end());

这里的表达式相当于100 < arr.

当然为了实现删除大于100的元素你同样可以使用bind2nd

// 移除所有大于100的元素
arr.erase( std::remove_if( arr.begin(), arr.end(),
     std::bind2nd( std::greater< int>(), 100)), arr.end());

前面说道=的比较,比如说x <= k怎么实现呢,std又提供了一个好东西not1,我们可以说 !(x > k) 和 x <= k是等价的,那么我们看看下面的表达式:

// 移除所有小于等于100的元素
arr.erase( std::remove_if( arr.begin(), arr.end(),
     std::not1(std::bind2nd( std::greater< int>(), 100))), arr.end());

说明:not1是否定返回值是单目的函数,std中还有not2它是否定返回值是双目的函数

评分

参与人数 3驿站币 +4 热心值 +4 收起 理由
01_avatar_small 天下第一 + 1 + 1 支持原创!
16_avatar_small 阳光 + 1 + 1 感谢分享!
88_avatar_small 寂寞江湖 + 2 + 2 很给力!

查看全部评分





上一篇:指针和引用的区别
下一篇:多线程 AfxBeginThread 与 CreateThread 的区别
08_avatar_middle
在线会员 发表于 2016-10-23 21:27:06 | 显示全部楼层
STL 名词解释
43_avatar_middle
在线会员 发表于 2016-10-24 10:07:16 | 显示全部楼层
?解释什么东西??
74_avatar_middle
在线会员 发表于 2016-10-24 11:17:47 | 显示全部楼层
看下什麼東西
74_avatar_middle
在线会员 发表于 2016-10-24 11:26:36 | 显示全部楼层

不要胡說八道 誤導 別人好嗎
一  functor 是一个定义了operator()的对象 是錯誤的說法 functor 是任何可以 像函數一樣調用的 東西 也就是 只要像是 functor 那它就是 functor 所以 函數 也是 functor 但 函數 不是對象 也不能定義 operator()
二  stl中算法通过iterator作用于数据的线性区间(linear range) 也是胡說
iterator 是用於訪問容器的 抽象層 其不一定是 線程空間 比如 std::set 使用 的 紅黑樹 std::list 使用 鍊錶 std::unordered_set 使用hash表 它們的 數據空間 都不一定是 線性的
其下內容 看不下去了 不知是否還有錯誤(一般需要回复才能 看到的文章 似乎都沒意思)
49_avatar_middle
在线会员 发表于 2016-10-25 10:08:24 | 显示全部楼层
看看怎么个给力发
46_avatar_middle
在线会员 发表于 2016-11-1 21:45:16 | 显示全部楼层
支持下!
51_avatar_middle
在线会员 发表于 2016-11-11 23:21:44 | 显示全部楼层
动不动就是隐藏恢复
42_avatar_middle
在线会员 发表于 2016-11-13 05:33:35 | 显示全部楼层
看看 ,歇息
35_avatar_middle
在线会员 发表于 2016-11-13 07:59:24 | 显示全部楼层
3qqqqqqqqqqqqq
38_avatar_middle
online_vip 发表于 2016-11-13 13:27:12 | 显示全部楼层
。。。。。。。。。。。。。。。。。。。。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-6-19 04:03

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表