C++使用lambda计算vector中位数赋值给int变量不生效如何解决
问题原因
你遇到的报错来自两个常见的lambda使用错误:
- 第一种写法中,lambda本身是可调用对象类型,不能直接赋值给
int类型的median变量,必须调用后拿到返回的整数值才能赋值。 - 你尝试的即时调用写法逻辑是正确的,通常运行异常要么是语法细节错误(比如漏写末尾分号),要么是传入的
v是空容器,取下标时触发越界。
正确用法
写法1:lambda定义后即时调用(单次计算中位数)
vector<int> v; // 此处为v填充元素的逻辑,必须保证v不为空 int median = [](vector<int> a) { sort(a.begin(), a.end()); return a[a.size() / 2]; }(v); // 直接传入v调用lambda,末尾补分号
写法2:保存lambda为变量多次复用
如果后续需要多次计算中位数,可以先把lambda存到变量里,需要时再调用:
// 先定义计算中位数的lambda auto get_median = [](vector<int> a) { sort(a.begin(), a.end()); return a[a.size() / 2]; }; // 任意需要计算的位置调用即可 int median = get_median(v);
注意事项
- 当前写法传值传入vector,每次调用都会拷贝整个容器,数据量大时会有额外开销。如果不想修改原容器且要优化性能,可以修改为传入const引用后在lambda内部做局部拷贝。
- 调用前必须保证传入的vector不为空,否则取下标操作会触发内存越界导致运行崩溃,如果允许空输入可以在lambda内部增加判空和异常处理逻辑。
内容的提问来源于stack exchange,提问作者RussianStranger
相关产品推荐
相关产品推荐

