Lambda 表达式知识点总结

Search for a command to run...

No comments yet. Be the first to comment.
一、有序对和笛卡尔积 1、有序对(序偶):由两个元素 x 和 y 按照确定顺序排列组成的二元组,记作⟨x, y⟩ 2、笛卡尔积:以 A 中元素为第一元、B 中元素为第二元,构造所有有序对⟨x,y⟩; 由全部这类有序对构成的集合,称为 A 与 B 的笛卡尔积,记作 AXB 例题: 已知 A={a,b}, B={0,1,2},求笛卡尔积 A × B、B × A A × B(前元取自 A,后元取自 B

1、集合的概念 N元子集:含有n个元素的子集叫做N元子集. 例题:已知集合 A={1,2,3},按元素个数对 A 的所有子集分类 0元子集:∅ 1元子集:{1}, {2}, {3} 2 元子集:{1,2}, {1,3}, {2,3} 3 元子集:{1,2,3} 幂集:设 A 为集合,由 A 的全部子集构成的集合称为 A 的幂集,记作P(A). 例题:A={1,2,3},求A的幂集 答案:P

一、基本元件 元件 符号 说明 例子 个体词 a, b, c... 代表具体对象(常元) a:小明 个体变元 x, y, z... 代表任意对象 x 表示论域中任一元素 谓词 P(x), Q(x,y)... 表示性质或关系 P(x):x是学生; L(x,y):x喜欢y 量词 ∀, ∃ 修饰个体范围 ∀x(所有x); ∃x(存在x) 连接词 ¬, ∧, ∨, →, ↔ 命

本质是"逻辑推导游戏",给定几个前提,用固定规则一步步推出结论。套路固定,背下规则就能拿分。 一、核心推理规则公式: 假言推理(MP)A→B, A ⇒ B肯定前件→肯定后件拒取式(MT)A→B, ¬B ⇒ ¬A否定后件→否定前件假言三段论(HS)A→B, B→C ⇒ A→C蕴含传递析取三段论(DS)A∨B, ¬A ⇒ B否定一边得另一边附加律A ⇒ A∨B或上一个随便什么化简律A∧B ⇒ A (或

定义:S是一个联结词集合,若任一个命题公式都可以由s中的联结词表示出来命题公式与之等价,则称S是一个联结词完备集。 也就是说一个连接词集合,能表达出所有真值函数,称为完备集 以下是完备集: S1={¬,∧,∨} —— 否定、合取、析取 S2={¬,∧,∨,→} —— 否定、合取、析取、蕴涵 S3={¬,∧,∨,→,↔} —— 否定、合取、析取、蕴涵、等价 S4={¬,∧} —— 否定、

本文是个人学习笔记,理解可能有误,欢迎指正!
Lambda表达式是C++11引入的匿名函数特性,允许在代码中内联定义函数,无需单独声明。
[捕获列表](参数列表) { 函数体 }
// 定义后立即调用
[]() {
std::cout << "Hello, Lambda!" << std::endl;
}(); // 输出: Hello, Lambda!
// 接受参数并返回结果
auto sum = [](int a, int b) {
return a + b;
};
std::cout << sum(5, 3) << std::endl; // 输出: 8
// Lambda可以赋值给auto变量
auto greet = [](const std::string& name) {
std::cout << "Hello, " << name << "!" << std::endl;
};
greet("Alice"); // 输出: Hello, Alice!
greet("Bob"); // 输出: Hello, Bob!
提示: 使用auto关键字存储Lambda时,变量的类型是编译器生成的唯一闭包类型。如果需要明确指定类型,可以使用std::function。
Lambda可以捕获其定义范围内的变量,这是它与普通函数的主要区别之一。
注释:Lambda 只能抓【上面 / 前面】已经定义好的变量,抓不到【下面 / 后面】还没定义的变量,并且只能抓定义时所在函数变量
int count = 0;
// 值捕获 - 创建副本
auto increment_copy = [count]() {
// count++; // 错误!不能修改捕获的副本
return count + 1;
};
std::cout << increment_copy() << std::endl; // 输出: 1
std::cout << count << std::endl; // 输出: 0 (原值未变)
int count = 0;
// mutable允许修改副本(但不影响原变量)
auto increment_mutable = [count]() mutable {
count++; // 修改的是副本
return count;
};
std::cout << increment_mutable() << std::endl; // 输出: 1
std::cout << increment_mutable() << std::endl; // 输出: 2
std::cout << count << std::endl; // 输出: 0 (原值未变)
int count = 0;
// 引用捕获 - 可以修改原变量
auto increment_ref = [&count]() {
count++; // 修改原变量
return count;
};
std::cout << increment_ref() << std::endl; // 输出: 1
std::cout << count << std::endl; // 输出: 1 (原值被修改)
C++14引入了泛型Lambda,允许参数类型自动推断。
// 泛型Lambda - 可以处理多种类型
auto add = [](auto x, auto y) {
return x + y;
};
// 可以用于各种类型
std::cout << add(5, 3) << std::endl; // 输出: 8 (int + int)
std::cout << add(2.5, 3.7) << std::endl; // 输出: 6.2 (double + double)
std::string a = "Hello ";
std::string b = "World";
std::cout << add(a, b) << std::endl; // 输出: Hello World (string + string)
Lambda可以方便地从函数返回,创建闭包。
// 函数返回Lambda
auto create_multiplier = [](auto factor) {
return [factor](auto x) { return x * factor; };
};
auto double_it = create_multiplier(2);
auto triple_it = create_multiplier(3);
std::cout << double_it(5) << std::endl; // 输出: 10
std::cout << triple_it(5) << std::endl; // 输出: 15
[] // 不捕获任何变量
[=] // 所有变量值捕获
[&] // 所有变量引用捕获
[x] // 仅x值捕获
[&x] // 仅x引用捕获
[=, &x] // 除x引用捕获外,其他值捕获
[&, x] // 除x值捕获外,其他引用捕获
Lambda是匿名函数 - 由[](){}组成,可以没有名字
可以捕获外部变量 - 这是与普通函数的主要区别
默认值捕获不修改原变量 - 创建的是副本
使用mutable可修改值捕获的副本 - 但不影响原变量
引用捕获可修改原变量 - 使用&符号
C++14支持泛型Lambda - 使用auto参数
Lambda类型是唯一的闭包类型 - 每个Lambda都有独特的类型
注意: 引用捕获要特别小心生命周期问题。如果Lambda的生命周期超过了它捕获的引用变量,会导致悬空引用。
一次性使用逻辑 - 不需要专门定义函数
回调函数 - 事件处理、异步操作
算法定制 - STL算法的自定义比较器、过滤器
快速测试 - 快速验证想法
函数式编程 - 创建高阶函数、闭包 总结: Lambda表达式是现代C++中非常重要的特性,它让代码更简洁、更安全、更易于维护,在多种场景下都能发挥作用!