天天看點

函數對象及擴充卡

 定義了調用操作符的類,其對象常稱作函數對象(function object),即它們的行為表現出類似于函數的行為。      函數對象通常用作泛型算法的實參,如标準庫中大量泛型算法有需要函數對象的版本。函數對象使用起來可以比函數靈活。标準庫在頭檔案<functional>頭檔案中定義了一組算術、關系與邏輯函數對象類,還定義了一組函數擴充卡,使我們能夠特化或者擴充标準庫所定義的以及自定義的函數對象類。  

 算術函數對象類型  plus<Type>   +
 minus<Type>  -
 multiplies<Type>  *
 divides<Type>  /
 modulus<Type>  %
 negate<Type>  -
 關系函數對象類型  equal_to<Type>  ==
 not_equal_to<Type>  !=
 greater<Type>  >
 greater_equal<Type>  >=
 less<Type>  <
 less_equal<Type>  <=
 邏輯函數對象類型  logical_and<Type>  &&
 logical_or<Type>  ||
 logical_not<Type>  !

     每個标準庫函數對象類表示一個操作符,即,每個類都定義了應用命名操作的調用操作符。上面隻有兩個一進制函數對象(unary function-object):negate<Type>和<logical_not<Type>,其它都是二進制函數對象(binary function-object)。      函數對象常用于覆寫算法中使用的預設操作符。在使用标準庫的函數對象時,需要生成該模闆類的一個執行個體對象,然後将生成的函數對象傳遞給算法。例如,sort預設使用operator<按升序對容器進行排序。為了按降序對容器進行排序,可以傳遞函數對象greater:    sort (svec.begin(), svec.end(), greater<string>()); 其中,greater<string>()表示生成一個比較元素類型為string類的greater函數對象。      标準庫提供了一組函數擴充卡(function adapter),用于特化和擴充一進制和二進制函數對象。函數擴充卡分為如下兩類:    1)綁定器(binder):它通過将一個操作數綁定到給定值而将二進制函數對象轉換為一進制函數對象。    2)求反器(negator):它将謂詞函數對象的真值求反。      标準庫定義了兩個綁定器擴充卡:bind1st和bind2nd。每個綁定器接受一個函數對象和一個值。bind1st将給定值綁定到二進制函數對象的第一個實參,bind2nd将給定值綁定到二進制函數對象的第二個實參。例如,為了計算一個容器中所有小于或等于10的元素的個數,可以這樣給count_if傳遞值:    count_if (vec.begin(), vec.end(), bind2nd(less_equal<int>(), 10));      标準庫還定義了兩個求反器:not1和not2。not1将一進制函數對象的真值求反,not2将二進制函數對象的真值求反。例如:    count_if (vec.begin(), vec.end(), not1(bind2nd(less_equal<int>(), 10))); 其效果是對不<=10的那些元素計數,即對>10的元素計數。  

繼續閱讀