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

std::transform使用异常:向原vector追加转换结果得到错误浮点值

根本原因

问题核心是std::vector的迭代器失效:

  • 调用std::transform时传入的输入范围[vertices.begin(), vertices.end()],指向vector当前占用的内存块。
  • 用std::back_inserter(vertices)向原vector追加元素的过程中,一旦元素总个数超过vector的现有容量,就会触发内存重分配:vector会申请更大的连续内存空间,把原有元素拷贝到新地址后释放旧内存。
  • 此时之前传入std::transform的begin、end迭代器全部变为野指针,后续遍历读取的都是已释放内存的垃圾值,转换后自然会得到-1.998397116e+18这类无意义的浮点结果。
修复方案

有两种常用的安全写法:

  1. 提前预留足够容量,避免插入时触发内存重分配,保证迭代器全程有效:
vertices.reserve(vertices.size() * 2);
std::transform(vertices.begin(), vertices.end(), std::back_inserter(vertices), [](float ver) {
    return ver + 1;
});
  1. 借助临时vector存储转换结果,再合并到原vector,彻底规避迭代器失效风险,通用性更强:
std::vector<float> temp;
temp.reserve(vertices.size());
std::transform(vertices.begin(), vertices.end(), std::back_inserter(temp), [](float ver) {
    return ver + 1;
});
vertices.insert(vertices.end(), temp.begin(), temp.end());

另外你现有代码lambda中捕获的index和sideDim没有被使用,可以按需删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 10:45:02