You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lambda表达式与成员函数指针在std::views::transform中有何差异?

C++视图变换中的拷贝陷阱:成员函数指针 vs Lambda表达式

Barry指出,在使用std::views::transform处理容器视图时,直接传递成员函数指针&Planter::getPlants的实现方式更优。因为用Lambda表达式[](Planter const& planter){ return planter.getPlants(); }的写法会意外触发不必要的拷贝操作。

以下是对比代码示例:

#if 1
    auto plants = planters
        | std::views::transform([](Planter const& planter){ return planter.getPlants();})
        | std::views::join
        | std::views::common
        ;
// 触发Plant拷贝构造函数×5
#else
    auto plants = planters
        | std::views::transform(&Planter::getPlants)
        | std::views::join
        ;
#endif
// 触发Plant拷贝构造函数×2

其中Plant是int类型的包装类,Planter是std::vector的包装类。两种写法的核心差异体现在拷贝构造函数的调用次数上:Lambda写法会额外触发多次拷贝,而成员函数指针写法的拷贝次数显著减少,避免了不必要的性能损耗。

内容的提问来源于stack exchange,提问作者Tom Huntington

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:05:24