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

关于std::for_each与结构体配合使用的技术疑问

关于std::for_each与自定义函数对象的疑问解答

先看你学习的这段代码:

std::vector<int> v{3, -4, 2, -8, 15, 267};

struct Sum
{
    void operator()(int n) { sum += n; }
    int sum {0};
};

// invoke Sum::operator() for each element
Sum s = std::for_each(v.cbegin(), v.cend(), Sum());    
std::cout << "sum:	" << s.sum << '\n';

问题解答

  1. 执行std::for_each前,变量s处于什么状态?
    执行std::for_each前,变量s还未被初始化——它是在std::for_each执行完毕后,被该函数返回的函数对象拷贝赋值,才完成初始化的。

  2. 在每次迭代过程中,s会发生哪些变化?
    迭代过程中s本身没有任何变化。std::for_each内部操作的是你传入的Sum()临时对象:每次遍历到向量的一个元素,这个临时对象就会调用重载的operator(),把元素值累加到自己的sum成员里。等所有迭代完成,这个临时对象会被拷贝给s,此时s的sum才会变成最终的累加结果。

  3. 若只想为s赋值单个元素,应如何编写代码?
    有几种实现方式:

  • 最直接的写法:先构造对象再调用运算符
    Sum s;
    s(10); // 10为你要赋值的单个元素
    
  • 利用匿名对象初始化的写法:
    Sum s = []{
        Sum temp;
        temp(10);
        return temp;
    }();
    
  • 给Sum结构体新增带参构造函数,简化初始化:
    struct Sum
    {
        void operator()(int n) { sum += n; }
        // 新增构造函数,直接初始化sum
        Sum(int n) : sum(n) {}
        int sum {0};
    };
    
    // 直接用单个元素初始化s
    Sum s(10);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:21:00