為使類屬性演算法具有靈活性,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函式物件概念 過載函式呼叫操作符的類,其物件常稱為函式物件 函式物件使用過載的 時,行為類似函式呼叫,也叫仿函式 本質 函式物件 仿函式 是乙個類,不是函式 函式物件使用 特點 函式物件在使用時,可以像普通函式那樣呼叫,可以有引數,可以有返回值 函式物件超出普通函式概念,函...