STL中的函式物件 一

2021-07-04 22:23:40 字數 3224 閱讀 4662

為使類屬性演算法具有靈活性,stl常用函式過載機制為演算法提供兩種形式,演算法的第一種形式使用的是常規操作來實現目標。在第二種形式中,演算法可以根據使用者指定的準則對元素進行處理。這種準則是通過函式物件來傳遞的。函式物件世紀上是過載了operator()的類模版。

stl提供了許多函式物件,這些物件包含在標頭檔案中。

函式物件

說明1、算術函式物件:

plus

x+yminus

x-ymultiplies

x*ydivides

x/ymodulus

x%ynegate

-x2、關係(比較)函式物件:

equal_to

x==y

not_equal_to

x!=y

greater

x>y

greater_equal

x>=y

less

xless_equal

x<=y

3、邏輯函式物件:

logical_not

!xlogical_and

x&&y

logical_or

x||y

stl中包含許多預定義的函式物件,其中有:

算術操作:plus, minus, multiplies, divides, modulus, 和 negate,例: assert(v2.size() >= v1.size() && v3.size() >= v1.size());

transform(v1.begin(), v1.end(), v2.begin(), v3.begin(),modulus());

把v1[i]%v2[i]存入v3[i]。

比較操作:equal_to, not_equal_to, greater, less, greater_equal, 和 less_equal,例: list::iterator first_nonnegative = find_if(l.begin(), l.end(), bind2nd(greater_equal(), 0));

在l中找到第乙個大於等於0的元素。

邏輯操作:logical_and, logical_or, 和 logical_not,例: char str[maxlen];

const char* wptr = find_if(str, str + maxlen,compose2(logical_or(),bind2nd(equal_to(), ' '),bind2nd(equal_to(), '\n')));

在str中找到第乙個空格或行尾。

以上三類都是模板類,要生成乙個函式物件需要例項化。同時在使用時,需要注意:

修改、組裝已有函式物件生成新的函式物件:unary_compose, binary_compose, unary_negate, binary_negate, binder1st, binder2nd, pointer_to_unary_function, pointer_to_binary_function, mem_fun_t, mem_fun_ref_t, mem_fun1_t 和mem_fun1_ref_t。這類函式物件就是所謂的函式物件介面卡,由於書寫生澀,一般不會直接例項化,都有對應的輔助函式(一般都是內聯型)簡化呼叫。

函式物件模板類名輔助函式名說明

unary_compose

compose1

unary_compose(const adaptableunaryfunction1& f,

const adaptableunaryfunction2& g); 生成乙個一元函式物件,操作為「f(g(x))」;vc6/7自帶stl沒有定義。

binary_compose

compose2

binary_compose(const adaptablebinaryfunction& f, 

const adaptableunaryfunction1& g1, 

const adaptableunaryfunction1& g2); 生成乙個二元函式物件,操作為「f(g1(x), g2(x))」;vc6/7自帶stl沒有定義。

unary_negate

not1

unary_negate(const adaptablepredicate& pred); 一元謂詞取非。

binary_negate

not2

binary_negate(const adaptablebinarypredicate& pred); 二元謂詞取非。

binder1st

bind1st

binder1st(const adaptablebinaryfunction& f,

adaptablebinaryfunction::first_argument_type c); 把二元函式物件的第乙個引數繫結為c,生成乙個一元函式物件。

binder2nd 

bind2nd

binder2nd(const adaptablebinaryfunction& f,

adaptablebinaryfunction::second_argument_type c); 把二元函式物件的第二個引數繫結為c,生成乙個一元函式物件。

pointer_to_unary_function

ptr_fun

把普通全域性函式或全域性函式指標(只能有1個或2個引數)轉換成函式物件。 ptr_fun有兩個原型分別生成pointer_to_unary_function物件和pointer_to_binary_function物件。

pointer_to_binary_function

mem_fun_t

mem_fun

把某個類的成員函式(只能有0個或1個引數,因為類成員函式的第乙個引數已定義為this指標)轉換成函式物件。 mem_fun有兩個原型分別生成mem_fun_t物件(是個一元函式物件)和mem_fun1_t物件(是個二元函式物件)。

mem_fun1_t

mem_fun_ref_t

mem_fun_ref

類似mem_fun,區別如下: struct t

};listlstt;

for_each(lstt.begin(),lstt.end(),mem_fun(&t::print));

listlstt;

for_each(lstt.begin(),lstt.end(),mem_fun_ref(&t::print));

mem_fun1_ref_t

STL中的函式物件

stl不但使我們能夠更輕鬆 更快捷地編寫複雜的 而且使編寫的 既標準又高度優化。std vectornames std sort names.begin names.end stl另乙個優雅之處在於高度可配置。在以上的 中,使用string的小於 操作符對vector中的string元素進行排序,但...

STL 函式物件

一 函式物件 functor stl中提供了一元和二元函式的兩種functor,通過unary function和binary function提供了這兩種不同引數數量的functor的基本結構,在這兩個型別中,分別內嵌定義一元和二元函式操作在模版推演的時候需要用到的typedef.一元函式的定義為...

STL 函式物件

4.1函式物件 4.1.1函式物件概念 過載函式呼叫操作符的類,其物件常稱為函式物件 函式物件使用過載的 時,行為類似函式呼叫,也叫仿函式 本質 函式物件 仿函式 是乙個類,不是函式 函式物件使用 特點 函式物件在使用時,可以像普通函式那樣呼叫,可以有引數,可以有返回值 函式物件超出普通函式概念,函...