函式物件:
1.就是乙個類,過載的()操作符,
2.函式物件可以像普通函式一樣被呼叫
3.函式物件可以像普通函式那樣接收引數
4.函式物件超出了函式的概念,函式物件可以儲存函式呼叫的狀態
5.一元仿函式就是指有乙個引數;二元就是兩個引數
謂詞:
謂詞是指
普通函式
或過載的 operator()
返回值是 bool 型別的函式物件(仿函式)。如果
operator 接受乙個引數,那麼叫做
一元謂詞
,如果接受兩個引數,那麼叫做
二元謂詞
,謂詞
可作為乙個判斷式。
函式物件介面卡:
函式物件介面卡是完成一些配接工作,這些配接包括繫結(bind),否定(negate),以及對一般函式或成員函式的修飾,使其成為函式物件,重點掌握函式物件介面卡:
bind1st、 bind2nd、not1、not2、
//10函式物件的概念
#include#include#include//for_each標頭檔案
#include//內建函式
using namespace std;
struct myprint
void operator()(int val) //第乙個是()過載,第二個()引數
public:
int num;
};void test01()
int num = 0; //真正開發中,盡量避免使用全域性變數 加鎖 解鎖麻煩,
//所以使用上面的類函式好一點
void print02(int val)
void test02()
cout << val << " ";
}void test03()
//不用迴圈和遞迴,列印0-n
//#define a(x) x;x;x;x;x;x;x;x;x;x; //不斷重複思想
//還可以用引用計數實現
class a
protected:
static int counter;
};int a::counter = 1;
void test04()
/*謂詞:
//謂詞是指普通函式或過載的 operator()返回值是 bool 型別的函式物件(仿函式)。如果
operator 接受乙個引數,那麼叫做一元謂詞, 如果接受兩個引數,那麼叫做二元謂詞,
謂詞可作為乙個判斷式。
1.謂詞,2仿函式,3自定義的比較函式 區別與聯絡:
1.謂詞是用以判斷引數是否具有某些性質的函式物件(可以是函式,函式指標,仿函式等)
(二元謂詞有另外的定義)
2.仿函式是過載了operator()的類物件,從而可以如函式一樣呼叫
3.自定義的比較函式是用於比較兩個引數之間是否滿足某個關係的函式
*///謂詞舉例略
//內建函式 標頭檔案(functional)
void test05()
//函式物件介面卡
/*仿函式介面卡 : bind1st bind2nd
仿函式介面卡 : not1 not2
仿函式介面卡 : ptr_fun
成員函式介面卡 : mem_fun mem_fun_ref
*/class myprint06 : public binary_function
};void test06()
int addnum = 200;
for_each(v.begin(), v.end(), bind2nd(myprint06(), addnum));
//繫結介面卡是將乙個二元函式物件轉變成一元函式物件
//bind1st bind2nd 區別?
//bind1st,將addnum繫結為函式物件的第乙個引數
//bind2nd,將addnum繫結為函式物件的第二個引數
}struct mycompare07 : public binary_function
};class myprint07
};class mynot1 : public unary_function
};//仿函式介面卡 not1,not2 取反介面卡
void test07()
for_each(v.begin(), v.end(), myprint07()); cout << endl;
cout << "*************************=" << endl;
sort(v.begin(), v.end(), not2(mycompare07()));
for_each(v.begin(), v.end(), myprint07()); cout << endl;
//not1 not2的區別
//如果對二元謂詞取反,用not2
//如果對一元謂詞取反,用not1
cout << "*************************===" << endl;
auto ret = find_if(v.begin(), v.end(), mynot1()); //在這個區間找大於5的第乙個數
auto ret2 = find_if(v.begin(), v.end(), not1(mynot1()));//現在就要繼承unary_function了
cout << *ret << endl;
cout << *ret2 << endl;
}void print08(int val,int val2)
//仿函式介面卡 ptr_fun
void test08()
for_each(v.begin(), v.end(), bind2nd(ptr_fun(print08),10));
//ptr_fun 把普通函式 轉成 函式物件
}//mem_fun mem_fun_ref 成員函式介面卡
class person
void show()
public:
int age;
int id;
};void test09()
int main()
C STL內建函式物件
4.3.1內建函式物件意義 概念 stl內建了一些函式物件 算術仿函式 關係仿函式 邏輯仿函式 這些仿函式所產生的物件,用法和一般函式完全相同 使用內建函式物件,需要引入標頭檔案 include 功能描述 實現四則運算 其中negate是一元運算,其他都是二元運算 template class t ...
C STL 之 內建函式物件
stl 內建了一些函式物件。分為 算數類函式物件,關係運算類函式物件,邏輯運算類仿函式。這些仿函式所產生的物件,用法和一般函式完全相同,當然我們還可以產生無名的臨時物件來履行函式功能。使用內建函式物件,需要引入標頭檔案 include。6 個算數類函式物件,除了 negate 是一元運算,其他都是二...
C STL庫的基本概念
vector 存放自定義資料型別,其資料結構和陣列非常相似,區別是陣列是靜態空間,而vector可以動態擴充套件 並不是在原空間之後接新空間,而是找更大的記憶體空間,然後將原資料拷貝到新空間,釋放原空間 插入元素push back 刪除元素pop back list list 是乙個雙向鍊錶,每個元...