目录
前言
有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;
标签:std,int,auto,捕获,C++,myMap,表达式,Lambda
From: https://www.cnblogs.com/zhouyitty/p/17713432.html