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这类无意义的浮点结果。
修复方案
有两种常用的安全写法:
- 提前预留足够容量,避免插入时触发内存重分配,保证迭代器全程有效:
vertices.reserve(vertices.size() * 2); std::transform(vertices.begin(), vertices.end(), std::back_inserter(vertices), [](float ver) { return ver + 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
相关产品推荐
相关产品推荐

