目錄前言必備理論知識:例子: 前言 有C#經驗,使用起來,駕輕就熟。 就是語法糖。但是也要熟悉用法,才好眾享絲滑。 內容參考: Chatjpt、文心一言 必備理論知識: 捕獲列表: []:預設不捕獲任何變數; [=]:預設以值捕獲所有變數;內部有一個相應的副本 [&]:預設以引用捕獲所有變數; [x ...
目錄
前言
有C#經驗,使用起來,駕輕就熟。
就是語法糖。但是也要熟悉用法,才好眾享絲滑。
內容參考:
Chatjpt、文心一言
必備理論知識:
捕獲列表:
[]:預設不捕獲任何變數;
[=]:預設以值捕獲所有變數;內部有一個相應的副本
[&]:預設以引用捕獲所有變數;
[x]:僅以值捕獲x,其它變數不捕獲;
[&x]:僅以引用捕獲x,其它變數不捕獲;
[=, &x]:預設以值捕獲所有變數,但是x是例外,通過引用捕獲;
[&, x]:預設以引用捕獲所有變數,但是x是例外,通過值捕獲;
[this]:通過引用捕獲當前對象(其實是複製指針);
[*this]:通過傳值方式捕獲當前對象;
lambda表達式的參數形式:
1. 無參數:[]() { /* function body */ };
2. 具名參數:[](int a, int b) { /* function body */ };
3. 預設參數:[](int a = 0, int b = 1) { /* function body */ };
4. 參數包:[](int a, ...) { /* function body */ };
註意點:
1. 有箭頭就必要有顯式返回類型 -> int
2. lambda 表達式在某些情況下可能會比函數指針或函數對象更耗費資源,需要註意性能問題。
3. 慎重選擇捕獲列表中的變數。按值捕獲會在 lambda 表達式創建時複製變數的值,而按引用捕獲則直接引用外部變數。
4. 複雜的表達式;返回類型最好明確指定。
5. 在 lambda 表達式內部添加適當的異常處理機制以確保程式的健壯性。
6. 在多線程環境中使用 lambda 表達式時,需要格外小心,確保正確地同步共用數據,以避免競態條件和數據競爭問題。??(我還只小懂呢,先記著)
[捕獲列表] (參數列表) -> 返回類型 {
// lambda 表達式的主體
}
例子:
auto print = []() {cout << "demo"; };
auto print1 = [](int a) {cout << a; };
auto print2 = [](int a, int b)->void{cout << a << b; };
auto add = [](int a, int b) -> int { return a + b; };
int x = 10; auto printX = [=]() {cout << x; };
//1. 使用lambda表達式過濾vector中的偶數:
std::vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9};
auto is_even = [](int x){ return x % 2 == 0; };
vec.erase(std::remove_if(vec.begin(), vec.end(), is_even), vec.end());
for (auto i : vec) {
std::cout << i << " ";
}
//2. 使用lambda表達式對map中的鍵進行排序:
std::map<std::string, int> myMap;
myMap["apple"] = 1;
myMap["banana"] = 2;
myMap["cherry"] = 3;
myMap["date"] = 4;
myMap["elderberry"] = 5;
auto compare = [](const std::pair<const std::string, int>& a, const std::pair<const std::string, int>& b){ return a.first < b.first; };
std::sort(myMap.begin(), myMap.end(), compare);
for (auto& x : myMap) {
std::cout << x.first << ": " << x.second << std::endl;
}
//3. 使用lambda表達式實現函數對象:
std::vector<int> nums{1, 2, 3, 4, 5, 6, 7, 8, 9};
auto square = [](int x){ return x * x; };
std::transform(nums.begin(), nums.end(), nums.begin(), square);
for (auto i : nums) {
std::cout << i << " ";
}
//4. 計算整數參數的總和:
auto sum = [](int a, ...) {
int total = a;
va_list args;
va_start(args, a);
while (true) {
int next = va_arg(args, int);
if (next <0) {
break;
}
total += next;
}
va_end(args);
return total;
};
int result = sum(1, 2, 3, 4, 5, -1); // result = 15
//5. 異常處理:
int divisor = 0;
auto divide = [&divisor](int dividend) {
try {
if (divisor == 0) {
throw std::runtime_error("Division by zero.");
}
return dividend / divisor;
} catch (const std::exception& e) {
std::cerr << "Exception caught: " << e.what() << std::endl;
return 0;
}
};
int result = divide(10);
std::cout << "Result: " << result << std::endl;