1. 程式人生 > >比較函式指標、函式符和lambda函式

比較函式指標、函式符和lambda函式

1.函式指標

函式指標即函式的地址,函式的地址是儲存其機器語言程式碼記憶體的開始地址。函式的地址可作為其他函式的引數。獲取函式的地址很簡單:只要使用函式名(後面不跟引數)即可。也就是說,如果think()是一個函式,則think就是該函式的地址。要將函式作為引數進行傳遞,必須傳遞函式名。一定要區分傳遞的是函式的地址還是函式的返回值。
process(think); //函式think()的地址傳給process()
process(think()); //函式think()的返回值傳給process()

2.函式符

函式符是可以以函式方式與()結合使用的任意物件。這包括函式名、指向函式的指標和過載了()

運算子的類物件(即定義了函式operator()()的類)。函式符是一個類物件,並非只能像函式名那樣使用它,這要歸功於類方法operator()()。函式符的優點之一是,可使用同一個函式符來完成這兩項基數任務。

例如:

class f_mod{
	public:
		f_mod(int d = 1) :dv(d){};
		bool operator()(int x){ return x%dv == 0; }

	private:
		int dv;
	};
f_mod obj(3); //f_mod.dv=3
而這個物件可使用方法operator()來返回一個bool值
bool is_div_by_3 = obj(7); //等價於obj.operator()(7)
3.lambda函式

名稱lambda來自lambda calculus(λ演算),一種定義和應用函式的數學系統。這個系統讓您能夠使用匿名函式——即無需給函式命名。在C++11中,對於接受函式指標或函式符的函式,可以使用匿名函式定義(lambda)作為其引數。

例如:

bool f3(int i){ return i % 3 == 0; }
函式f3()對應的lambda表示式為:
[](int x){ return x % 3 == 0; }
差別有兩個:1)使用[]代替了函式名(這就是匿名的由來)

                      2)沒有宣告返回型別。返回型別相當於使用decltyp根據返回值推斷得到的,這裡為bool。

函式指標、函式符和lambda函式code:

#include"iostream"
#include"vector"
#include"algorithm"
#include"cmath"
#include"ctime"

using namespace std;

const long Size1 = 39L;
const long Size2 = 100 * Size1;
const long Size3 = 100 * Size2;

bool f3(int i){ return i % 3 == 0; }
bool f13(int i){ return i % 13 == 0; }

int main()
{
	vector<int> numbers(Size1);
	srand(time(0));
	generate(numbers.begin(), numbers.end(),rand);
//使用函式指標
	cout << "Sample size"<<Size1<< endl;
	int count3 = count_if(numbers.begin(), numbers.end(),f3);
	int count13 = count_if(numbers.begin(), numbers.end(), f13);
	cout << "Conut of numbers divisible by 3:" << count3 << endl;
	cout << "Conut of numbers divisible by 13:" << count13 << endl;
	//增加numbers的個數
	numbers.resize(Size2);
	generate(numbers.begin(), numbers.end(), rand);
	cout << "Sample size" << Size2 << endl;
//使用函式符
	class f_mod
	{
	public:
		f_mod(int d = 1) :dv(d){};
		bool operator()(int x){ return x%dv == 0; }

	private:
		int dv;
	};
	 count3 = count_if(numbers.begin(), numbers.end(), f_mod(3));
	 count13 = count_if(numbers.begin(), numbers.end(), f_mod(13));
	cout << "Conut of numbers divisible by 3:" << count3 << endl;
	cout << "Conut of numbers divisible by 13:" << count13 << endl;
	//增加numbers的個數
	numbers.resize(Size3);
	generate(numbers.begin(), numbers.end(), rand);
	cout << "Sample size" << Size3 << endl;
//使用lambdas表示式
	 count3 = count_if(numbers.begin(), numbers.end(), [](int x){ return x % 3 == 0; });
	 count13 = count_if(numbers.begin(), numbers.end(), [](int x){ return x % 13 == 0; });
	cout << "Conut of numbers divisible by 3:" << count3 << endl;
	cout << "Conut of numbers divisible by 13:" << count13 << endl;
	system("pause");
	return 0;
}


相關推薦

比較函式指標函式lambda函式

1.函式指標 函式指標即函式的地址,函式的地址是儲存其機器語言程式碼記憶體的開始地址。函式的地址可作為其他函式的引數。獲取函式的地址很簡單:只要使用函式名(後面不跟引數)即可。也就是說,如果think()是一個函式,則think就是該函式的地址。要將函式作為引數進行傳遞,

Scala學習筆記(六):本地函式頭等函式佔位部分應用函式

本地函式 可以在方法內定義方法,這種方法叫本地函式,本地函式可以直接訪問父函式的引數 def parent(x: Int, y: Int): Unit ={ def child(y:Int) = y + 1 val z = child(y) println(s"x: $x, z

C/C++陣列指標指標陣列函式指標變數的宣告用法

#include <iostream> using namespace std; void fun1(int(*pArr)[3], int row) { int i,j; for (i = 0; i < row; i++) { for (j = 0; j <

C++小知識——指標函式函式指標指標陣列陣列指標示例

一、指標函式和函式指標 1.1 指標函式 指標函式,其實就是返回值為指標的函式 例如: long *func(int) 它是一個名為func,返回值為long *,引數為int的指標函式 1.2 函式指標 就像陣列名是指向陣列第一個元素的常指標一樣,函式

函式指標函式物件仿函式比較與入門

#include<iostream> using namespace std; typedef void (*func)(int ); void print(int value) { printf("%d ", value); } void

PYTHON自動化Day6-函式多個返回值匿名函式列表生成式,三元運算子,os模組,sys模組,時間模組,字典排序,資料庫操作,加密(md5)

一.函式多個返回值和匿名函式 #函式返回多個值,用一個變數接收 def say(): num1=1 num2=2 num3=3 return num1,num2,num3 res=say() print(res) #打印出來是元組。 函式如果返回多個值的話,會把返回的

C++函式指標指標函式返回值為函式指標函式淺談

C++函式指標、指標函式、返回值為函式指標的函式淺談 引言 函式指標、指標函式是C中重要而容易混淆的概念,博主將通過兩個例項來說明這兩個截然不同的概念。 而返回值為函式指標的指標函式就更難理解了,放在文章的最後來介紹。 函式指標 函式指標是一種特殊的 指標,它指向函式的入口。

python--- map函式lambda函式

1...lambda 函式相當於一個匿名函式,顧名思義就是不用取名字的函式,相當於現實中的匿名信。 舉例: lambda x,y: x+y m = lambda x,y,z: (x-y)*z print (m(3,1,2))  執行結果:4 2...map函式&nb

函式指標陣列指標指標陣列二級指標

函式指標、陣列指標、指標陣列、二級指標 函式指標 函式名就是個指標 函式的指標 ''' bool func(int num) { printf("heihei"); } int main() { bool (func_p)(int num); func_p = func; func_p(10

函式指標,轉移表回撥函式的理解

函式指標 函式指標顧名思義就是將函式看做一個指標,用一個指標來儲存函式的地址 函式指標的用法: 函式指標的正確寫法是  void (*p1)() 而 void *p2() 是無法存放函式指標的,因為這是返回值為指標的函式,p1先與*結合,說明p1是一個指標,指標指向一個

筆記八:靜態變數靜態成員函式函式指標靜態函式指標

靜態變數 1、靜態變數的儲存方式和生命週期:屬於靜態儲存方式,其儲存空間為記憶體中的靜態資料區,該區域的資料在整個程式的執行期間不會釋放,所以其生命週期為整個程式執行時間段。 2、靜態區域性變數:定義在函式體內的變數。當對靜態區域性變數進行初始化時,只

C語言之指標指標陣列陣列指標函式指標二重指標泛型函式

指標陣列:數組裡面的每個元素都是指標;char*  array[]={"hello","world","ooo"};理解:陣列中有三個元素,每個元素都是char*型別,陣列中儲存的是三個字串的首地址;64位的作業系統中指標佔8個位元組;32位作業系統指標佔4個位元組;注意:指

Android JNI程式設計(六)——C語言函式指標Unition聯合體列舉Typedef別名結構體結構體指標

一:函式指標 1.函式指標顧名思義就是定義一個指標變數指向一個函式,和一級指標並沒有很大的區別我們看如下程式碼就很清楚的知道了 #include<stdio.h> #include<stdlib.h> //定義一個函式 in

C++ 靜態成員函式 訪問 類成員變數 & 函式指標函式指標陣列函式指標陣列指標的使用 & 回撥函式的使用

靜態成員函式可以通過引用類物件訪問類成員變數;test.h#ifndef TEST_H #define TEST_H class Test { public: Test(); Tes

指標陣列陣列指標函式指標函式指標陣列詳解

總結指標和陣列部分的相關知識自己寫的一遍部落格:指標是變數單元的地址,地址指向該變數單元,因此地址形象的稱為“指標”,通過指標(地址)可以找到記憶體單元。  (總結)1.指標是存放地址才出現的,地址是為

C++多維陣列:儲存方式訪問方式作為函式引數

C++中陣列可以巢狀,就是多維陣列。 多維陣列儲存與訪問方式 二維陣列:一維陣列可對應數學中的向量,而二維陣列可對應矩陣,可用一個二維陣列儲存矩陣。 圖1  二維陣列mat示意圖 二維陣列的橫向稱為行,縱向稱為列,上面這個陣列為三行六列。定義二維陣列的通用格式為:    

VB.NET學習筆記:程式碼註釋Sub過程Function函式註釋窗體模組類標頭檔案註釋

註釋能使你的程式碼更加容易理解,更多時候註釋是寫給自己看的,相信我,過不了多長時間你就會把程式設計的思路忘記,有了註釋就能加快你的思路回憶。 一、程式碼註釋 很簡單,就是用英文的“’”分號開頭,可以單獨成行,也可以註釋到每句程式碼結束處。如: Public Class ClsCustom

函式指標函式指標陣列函式指標的陣列的指標的概念

·函式指標 首先讓我們看一段程式碼: int Add(int x,int y) { return x+y; } int main() { printf("%p\n",Add); printf("%p\n",&Add); return 0; } ·這是結

繼承 虛繼承虛擬函式表對類的大小的影響

一、真空類 class CNull { }; 長度:1 記憶體結構: ?? 評註:長度其實為0,這個位元組作為內容沒有意義,可能每次都不一樣。 二、空類 class CNull2 { public:     CNull2(){printf("Construct/

C語言:函式指標函式指標陣列函式指標陣列的指標

一.函式指標 1.定義理解 函式指標:是一個指標,存放函式地址的指標。 函式的地址可以通過取地址函式名拿到,也可以通過函式名直接拿到。 2.函式指標 (1)定義一個函式test void test(char *str) { printf("