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

C++17中为何std::partial_sum写入空vector崩溃,用back_inserter正常?

为什么std::partial_sum用temp.begin()会段错误,而std::back_inserter可行?

你遇到的段错误核心原因是空vector的begin()迭代器无法直接用于写入数据,具体区别如下:

第一种代码的问题

你声明的temp是一个空的vector<double>,此时temp.begin()返回的迭代器指向容器起始位置,但这个位置并没有分配实际内存空间(空vector没有元素)。std::partial_sum会尝试将计算出的部分和直接写入该迭代器指向的地址,这属于非法内存访问,直接触发段错误。

第二种代码的原理

std::back_inserter(temp)是一个插入迭代器,它的工作逻辑不是直接写入已存在的内存位置,而是每次赋值时自动调用temp.push_back()方法:

  • 自动管理vector的内存分配(如果当前容量不足,vector会自动扩容)
  • 把计算出的部分和逐个添加到temp的末尾
    完全避免了内存越界问题,所以代码能正常运行。

额外补充:不用back_inserter的可行写法

如果你想直接用temp.begin(),可以提前给temp分配足够的内存空间。因为你计算的是earnings.begin()+1到earnings.begin()+3(共2个元素)的部分和,只需给temp预留2个元素的空间:

vector<double> earnings = {1,2,3,4,5,6,7};
vector<double> temp(2); // 提前分配2个元素的空间
std::partial_sum(earnings.begin() + 1, earnings.begin() + 3, temp.begin());

这样temp.begin()指向有效的内存位置,写入操作就不会触发段错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:42:40