在微軟即將發布的Visual Studio 2010正式版中,其對C++語言做了一些修改,之前51cto也報道過Visual Studio 2010中關於C++項目的升級問題,文章則針對C++語言上的一些變化。
Lambda表達式
很多編程編程語言都支持匿名函數(anonymous function)。所謂匿名函數,就是這個函數只有函數體,而沒有函數名。Lambda表達式就是實現匿名函數的一種編程技巧,它為編寫匿名函數提供了簡明的函數式的句法。同樣是Visual Studio中的開發語言,Visual Basic和Visual C#早就實現了對Lambda表達式的支持,終於Visual C++這次也不甘落後,在Visual Studio 2010中添加了對Lambda表達式的支持。
Lambda表達式使得函數可以在使用的地方定義,並且可以在Lambda函數中使用Lambda函數之外的數據。這就為針對集合操作帶來了很大的便利。在作用上,Lambda表達式類似於函數指針和函數對象,Lambda表達式很好地兼顧了函數指針和函數對象的優點,卻沒有它們的缺點。相對於函數指針或是函數對象復雜的語法形式,Lambda表達式使用非常簡單的語法就可以實現同樣的功能,降低了Lambda表達式的學習難度,避免了使用復雜的函數對象或是函數指針所帶來的錯誤。我們可以看一個實際的例子:
- #include "stdafx.h"
- #include <algorithm>
- #include <iostream>
- #include <ostream>
- #include <vector>
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- vector<int> v;
- for (int i = 0; i < 10; ++i) {
- v.push_back(i);
- }
- for_each(v.begin(), v.end(), [] (int n) {
- cout << n;
- if (n % 2 == 0) {
- cout << " even ";
- } else {
- cout << " odd ";
- }
- });
- cout << endl;
- return 0;
- }
- #include "stdafx.h"
- #include <algorithm>
- #include <iostream>
- #include <ostream>
- #include <vector>
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- vector<int> v;
- for (int i = 0; i < 10; ++i) {
- v.push_back(i);
- }
- for_each(v.begin(), v.end(), [] (int n) {
- cout << n;
- if (n % 2 == 0) {
- cout << " even ";
- } else {
- cout << " odd ";
- }
- });
- cout << endl;
- return 0;
- }
這段代碼循環遍歷輸出vector中的每一個數,並判斷這個數是奇數還是偶數。我們可以隨時修改Lambda表達式而改變這個匿名函數的實現,修改對集合的操作。在這段代碼中,C++使用一對中括號“[]”來表示Lambda表達式的開始,其後的”(int n)”表示Lambda表達式的參數。這些參數將在Lambda表達式中使用到。為了體會Lambda表達式的簡潔,我們來看看同樣的功能,如何使用函數對象實現:
- #include "stdafx.h"
- #include <algorithm>
- #include <iostream>
- #include <ostream>
- #include <vector>
- using namespace std;
- struct LambdaFunctor {
- void operator()(int n) const {
- cout << n << " ";
- if (n % 2 == 0) {
- cout << " even ";
- } else {
- cout << " odd ";
- }
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- vector<int> v;
- for (int i = 0; i < 10; ++i) {
- v.push_back(i);
- }
- for_each(v.begin(), v.end(), LambdaFunctor());
- cout << endl;
- return 0;
- }
- #include "stdafx.h"
- #include <algorithm>
- #include <iostream>
- #include <ostream>
- #include <vector>
- using namespace std;
- struct LambdaFunctor {
- void operator()(int n) const {
- cout << n << " ";
- if (n % 2 == 0) {
- cout << " even ";
- } else {
- cout << " odd ";
- }
- }
- };
- int _tmain(int argc, _TCHAR* argv[])
- {
- vector<int> v;
- for (int i = 0; i < 10; ++i) {
- v.push_back(i);
- }
- for_each(v.begin(), v.end(), LambdaFunctor());
- cout << endl;
- return 0;
- }
通過比較我們就可以發現,Lambda表達式的語法更加簡潔,使用起來更加簡單高效。