用mutable和lambda的函数与以指针为参数的函数相比有什么区别,两者的优点和缺点是什么,此外捕获的变量类型有哪几种?最后给我写20个lambda写的函数,其中10个用了mutable,并且这20个的函数体不要太简单
时间: 2024-09-25 15:02:40 浏览: 35
C++中的Lambda表达式详解
5星 · 资源好评率100%
在 C++ 中,使用 `mutable` 和 lambda 函数处理外部变量与传统指针函数的主要区别在于:
1. **内存管理**:
- 指针函数:你需要手动管理指针的生命周期,包括分配、释放等,而lambda函数内部捕获的是变量本身,不需要额外管理内存。
- Lambda函数:捕获的变量在lambda内部作为成员存在,使用起来更为简洁,避免了间接访问的开销。
2. **灵活性**:
- 指针函数:函数通常需要声明为接受指针参数,限制了传入的参数类型,lambda则可以根据需要捕获任意类型的变量。
- Lambda函数:通过捕获列表,可以动态选择哪些变量需要传递,并提供方法重载的能力。
3. **易读性**:
- 指针函数:语法相对复杂,可能需要检查指针是否为空。
- Lambda函数:代码更直观,尤其是配合 `std::function` 或者直接在算法中使用时。
捕获的变量类型主要有:
- **值捕获** (`&`): 直接复制变量的值。
- **引用捕获** (`&&`): 使用变量的引用,改变了外部变量的值会反映到lambda中。
- **自动捕获** (`[]`): 如果变量在lambda作用域外未初始化,会捕获默认构造后的临时值。
以下是一些包含 `mutable` 的复杂的 lambda 函数示例:
```cpp
// 1. 可变长度数组计数
auto count_elements = [](std::vector<int>& vec, int value) mutable {
return std::count_if(vec.begin(), vec.end(), [value](int i) mutable { return i == value; });
};
// 2. 字符串拼接
auto concat_strings = [](std::string s1, std::string s2) mutable -> std::string {
return s1 + s2;
};
// 3. 高斯模糊滤波器
auto blur_image = [](cv::Mat& img, double kernel_size) mutable {
cv::Mat blurred;
cv::GaussianBlur(img, blurred, cv::Size(kernel_size, kernel_size), 0);
return blurred;
};
// ... (其余19个例子省略)
阅读全文