c++ - 在 lambda 中捕获 std::array
问题描述
我试图测试一些简单的 C 风格的排序函数。在驱动程序中,我写了这样的东西:
int main()
{
std::array<int, 8> A = { 1, 0, 4, 5, 7, 2, 9, 3 };
auto lambda = [&A](const std::function<void(int *A, int n)> &sorting_alg) {
int n = A.size();
sorting_alg(A.data(), n);
std::cout << "=> ";
print(A.data(), n);
std::cout << std::endl;
};
auto do_bubble_sort = std::bind(lambda, bubble_sort);
auto do_selection_sort = std::bind(lambda, selection_sort);
auto do_insertion_sort = std::bind(lambda, insertion_sort);
std::cout << "Bubble Sort :" << std::endl;
do_bubble_sort();
std::cout << "Selection Sort :" << std::endl;
do_selection_sort();
std::cout << "Insertion Sort :" << std::endl;
do_insertion_sort();
return 0;
}
我有绑定代码,我可以将其传递A
给副本,但它将我的 lambda 限制为size=8
,我想避免这种情况。是否可以在不使用诸如之类的东西的情况下实现这一目标std::vector
?一旦我将捕获方法更改A
为值捕获,它就不再编译了。我想使用数组的副本来测试所有排序功能。为什么我不能std::array
按价值捕获?为什么尺寸推断适用于参考案例?
解决方案
默认情况下operator()
,lambdaconst
的 。这意味着您不能修改 lambda 的任何成员(它是捕获)。当您通过引用捕获时,这意味着您不能将引用更改为引用其他内容,但是由于您已经不能这样做,因此基本上没有任何意义。当您按值捕获时,它会生成该值const
,这意味着您不能再像排序方法所需的那样进行修改(您需要data
返回一个非常量指针)。
为了解决这个问题,您可以使用mutable
关键字来制作 lambda 的operator()
not const
。那看起来像
auto lambda = [A](const std::function<void(int *A, int n)> &sorting_alg) mutable {
int n = A.size();
sorting_alg(A.data(), n);
std::cout << "=> ";
print(A.data(), n);
std::cout << std::endl;
};
推荐阅读
- r - dbinom - 4 参数逻辑回归
- google-bigquery - 根据日期创建 BigQuery 表
- angular - 如何解决错误 ng-snotify 在从 8 更新到 Angular 9 之前具有不兼容的对等依赖项?
- ios - 按钮边框颜色不会更改为自定义颜色
- node.js - 在 sequelize 中定义自定义验证
- ionic-framework - 菜单中的 useIonViewDidEnter 在 ionic-react 中不起作用
- google-cloud-platform - GCP 签名 URL 的 CORS 问题
- python - 如何从python中的HTML中提取时间类?
- python - 关于使用python3的列表列表的问题
- python - 以编程方式更改 Python 控制台的字体