1.2 函數對象
我將介紹STL使用的一些基本的技術,它會讓你了解:在普通C++機制上建立的STL是如何提供空前的靈活性和性能的。迄今為止,我們所描述的STL框架組件都有些嚴格。每種算法都嚴格地采用標準指定的方法來準確地實現某種功能。例如,我們需要查找一個與自己指定的值相等的元素。實際上,查找一個帶有某些(自己指定的)屬性的元素,例如小于某個給定的值、匹配某個并非簡單相等的值(例如,匹配大小寫無關的字符串或者在允許很小差別的情況下,匹配雙精度數值),是一項很普通的事務。
下面的例子不是查找值7,我們將查找某些符合條件的值(也就是小于7的值):
vector::iterator p = find_if(v.begin(),v.end(),Less_than(7));
if (p != vi.end()) {
// 我們找到了值小于7 的元素
// …
}
else {
// vi 沒有值小于 7 的元素
// …
}
Less_than(7)是什么東西呢?它是一個函數對象,它是某個類的對象,該類帶有應用程序操作符(( )),被定義成執行某個函數:
template struct Less_than {
T value;
Less_than(const T& v) :value(v) { }
bool operator()(const T& v) const { return v
例如:
Less_than f(3.14); // Less_than 保存了雙精度值 3.14
bool b1 = f(3); // b1 為真(3<3.14 是真的)
bool b2 = f(4); // b2 為假(4<3.14 是假的)
從2004年的情況來看,在D&E中沒有提到函數對象是很奇怪的。我們應該使用一個章節來講述它們。甚至于用戶自定義的應用程序操作符(( ))的使用情況也沒有提到,盡管它已經存在很長時間,并且很卓著。例如,它是幾個最初的允許重載的操作符之一(在=之后),它還用于模仿Fortran下標(subscript notation)。
我們可以編寫一個find()版本,它使用了函數對象,而不是簡單的!=來檢測是否可以找到某個元素。它的名字是find_if():
template
In find_if(In first, In last, Pred pred)
{
while (first!=last && !pred(*first)) ++first;
return first;
}
我們簡單地用!pred(*first)代替了*first!=val。函數模板find_if()會接受任何能夠把元素值作為參數調用的對象。特別地,我們可以把普通的函數作為它的第三個參數來調用find_if():
bool less_than_7(int a)
{
return 7::iterator p = find_if(v.begin(),v.end(),less_than_7);
但是,這個例子顯示了,與函數相比我們為什么更喜歡函數對象:我們可以使用一個(或多個)參數來初始化函數對象,同時函數對象可以保持這些信息供以后使用。函數對象可以保持任何狀態。這樣就可以形成更通用、更優良的代碼。如果我們需要,我們以后可以檢查它的狀態。例如:
文章來源于領測軟件測試網 http://www.kjueaiud.com/