初學STL子仿函式和函式介面卡之一

2021-06-08 18:48:47 字數 2747 閱讀 5109

仿函式即定義了operator()的物件。
如:funcitonobjecttypeclass fo;

fo(...);

其中fo()是呼叫fo的operator(),而非呼叫fo().這一點很重要是核心。

也就是說並不是將所有語句放在一般的函式中。

void fo()

而是放在operator()中如下:

class funcitonobjecttypeclass

}

這個特性常用在有序的容器中。如以下。

對乙個擁有person物件的容器,按照person的名稱進行排序,要是名稱相同按照年齡排序。

則可以這樣使用。

//二段判式

class person

;class personsortcriterion

};

測試**如下:

person per1;

per1.name = "aaaa";

per1.age = 23;

person per2;

per2.name = "aaab";

per2.age = 24;

person per3;

per3.name = "aaaa";

per3.age = 21;

person per4;

per4.name = "bbbb";

per4.age = 21;

cout<

personset personsotfunction;

personsotfunction.insert(per1);

personsotfunction.insert(per2);

personsotfunction.insert(per3);

personsotfunction.insert(per4);

personset::iterator pospersonset;

for (pospersonset = personsotfunction.begin();pospersonset != personsotfunction.end();++pospersonset)

int operator()()

};

//測試**如下,其中print_elements是用於列印容器元素的。

cout<

intsequence seq(1);

generate_n(back_inserter(listfuctor),4,seq);

print_elements(listfuctor,"value: ");
generate_n(back_inserter(listfuctor),4,intsequence(42));

print_elements(listfuctor,"insertvalue: ");

generate_n(back_inserter(listfuctor),4,seq);

print_elements(listfuctor,"repeatseq: ");

//print_elements,是個模板方法,方法如下

templateinline void print_elements(const t& coll, const char* optcstr)

std::cout

intsequence seq(1);

generate_n>,int,intsequence& >(back_inserter(listfuctor),4,seq);

print_elements(listfuctor,"byreference: ");

generate_n(back_inserter(listfuctor),4,intsequence(42));

print_elements(listfuctor,"insertvalue: ");

generate_n(back_inserter(listfuctor),4,seq);

print_elements(listfuctor,"repeatseq: ");

由結果可以看出,intseque仿函式的內部狀態並沒有因為第一次的呼叫而被改變。所以要注意仿函式是按值來傳遞引數的。

例項二:for_each()的返回值。for_each的獨特之處在於可以返回仿函式,這樣就額可以通過for_each()的返回值來獲取仿函式的狀態。這裡的狀態其實也可以理仿函式中的某乙個成員變數的返回值,或者某乙個成員變數的值。

//定義仿函式

//求平均數的仿函式

class meanvalue

void operator()(int elem)

double value()

};

//呼叫的地方:

cout<

for (index = 1;index < 9;++index)

print_elements(collrepeatlist,"collrepeat: ");

meanvalue mv = for_each(collrepeatlist.begin(),collrepeatlist.end(),meanvalue());

cout<

結果如下:

STL介面卡 函式介面卡

有時候需要對內建函式物件返回值進行進一步的簡單計算,或者填上多餘的引數,不能直接代入演算法。函式介面卡實現了這一功能,函式介面卡是將一種函式物件轉化為另一種符合要求的函式物件。函式介面卡可以分為4個大類 繫結介面卡 組合介面卡 指標函式介面卡和成員函式介面卡。需求 在遍歷容器的時候,將容器中的值全部...

STL中函式介面卡

首先為什麼要用函式介面卡?stl中的函式介面卡分類 1 繫結介面卡用法 將乙個運算元繫結到給定值而將二元函式物件轉換為一元函式物件。bind2nd 將給定值繫結到二元函式物件的第二個實參 bind1st 將給定值繫結到二元函式物件的第乙個引數 示例程式如下 include include inclu...

函式介面卡

介面卡模式是一種常用的設計模式,介面卡將乙個類的介面轉換成客戶希望的另外乙個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以在一起工作。簡單來說介面卡模式就是設計乙個介面卡,例項化乙個實現具體功能的類物件作為自己的成員。然後介面卡提供一些方法,這些方法實際上都將轉化成對這個成員的方法...