我們在前一節介紹了函式物件的概念,本節介紹基於函式物件的乙個概念–函式物件介面卡。
在講函式物件介面卡之前,我們來講一講普通函式,函式物件和函式物件介面卡的關係。
普通函式是對程式功能的一種封裝。這種封裝只提供了方法,卻沒有提供屬性。所以當我們希望使用某些屬性時,我們往往使用普通函式的公升級版–函式物件。我們可以將常用演算法和函式物件結合起來使用,這樣能完成更複雜的功能。當我們定義了乙個函式物件,而這個函式物件又跟我們的需求有一定的偏差時,我們就需要函式物件介面卡了。函式物件介面卡本質上任然是乙個函式;函式物件介面卡提供了對函式物件或者普通函式的操作,使其能夠根據我們的需求來修改函式物件或者普通函式的功能。下面我們從乙個案例開始講起。
加const
//列印小於指定數字的vector容器中的元素
#include
#include
#include
#include
using
namespace
std;
class print_int:public binary_function
}};int main()
for_each(v.begin(), v.end(), bind2nd(print_int(),5)); //繫結第二個引數5
cout
<< endl;
return
0;}
取反介面卡的例子:
#include
#include
#include
#include
using
namespace
std;
class compare_num:public binary_function
};class compare_5:public unary_function
};int main()
cout
<< endl;
vector
::iterator i = find_if(v.begin(), v.end(), bind2nd(compare_num(),6));
if (i == v.end())
else
auto j = find_if(v.begin(), v.end(), not1(compare_5())); //取反介面卡的用法
if (j == v.end())
else
return
0;}
普通函式介面卡——ptr_fun
#include
#include
#include
#include
using
namespace
std;
void print(int i,int j)
}void test02()
for_each(v.begin(), v.end(), bind2nd(ptr_fun(print),5)); //使用ptr_fun將普通函式轉換為函式物件,然後給函式物件繫結引數。
cout
<< endl;
}int main()
最後,我們介紹mem_fun 和 mem_fun_ref
我們看一下場景。我們在以上的事例中使用的都是vector
資料型別實際上vector可以存放標準資料型別,物件和指標。當我們存放的是物件時,物件本身具有方法。這個方法是定義在類中的成員函式。那麼如何將成員函式轉換成函式物件呢?
這個時候就要使用mem_fun_ref
擴充套件:如果容器中存放的是指標,那麼就是使用方法mem_fun
#include
#include
#include
#include
using
namespace
std;
class teacher
void print()
void
operator()(teacher &t)
};class teacher_print
};int main()
C STL 容器介面卡
標準庫提供了三種順序容器介面卡 queue priority queue stack.介面卡是標準庫中通用的 概念,包括容器介面卡 迭代器介面卡和函式介面卡。本質上,介面卡是使一事物的行為類似於另一類事物的行為的一種機制。容器介面卡讓一種已 存在的容器型別採用另一種不同的抽象型別的工作方式實現。例如...
C STL 容器介面卡
1 stack 2 priority queue include 1 基礎介紹 priority queue 優先佇列,其底層是用堆來實現的。模板宣告帶有三個引數 priority queue 其中type為資料型別,container 為儲存資料的容器,functional 為元素比較方式。con...
函式物件介面卡
include include include include include include include using namespace std 函式物件介面卡bind1st,bind2nd struct myprint public binary function binary functi...