【问题标题】:Unexpected behaviour in std::transformstd::transform 中的意外行为
【发布时间】:2021-10-01 16:26:36
【问题描述】:

我有一个std::vector<float> vertices,我想对其进行转换并将结果附加到向量上;到目前为止,我已经这样做了:

std::transform(vertices.begin(), vertices.end(), std::back_inserter(vertices), [index = 0,&sideDim] (float ver) mutable{
                    return ver + 1;
                });

但对于每个新插入,我似乎都得到了 -1.998397116e+18 的浮点值。这是为什么呢?

【问题讨论】:

  • 当你向容器追加元素时,end 迭代器失效。
  • 为什么要捕获indexsideDim?以及为什么要制作 lambda mutable
  • 不清楚你想做什么。您可以发布一个带有一些数字的示例吗?
  • 请发minimal reproducible example,如果你的向量容量在变换过程中增加,你传入的迭代器就会失效

标签: c++ algorithm stl


【解决方案1】:

在上一行添加vertices.reserve(vertices.size()*2)

您的反向插入使您的迭代器无效并重新分配您正在读取的缓冲区。所以你得到了垃圾。

您发布的代码也可能没有做您想做的事情,但这修复了发布代码中的 UB。

【讨论】:

    最近更新 更多