void GenerateNativeGamma(vector<float>& gammaNative,
float dDetX,
float sdd,
float moduleGapX,
int nModule,
int nChanDetX)
{
float L = 7*dDetX + (0.78/2+0.11/2);
gammaNative.push_back(0);
for (float n = 6.5; n>=-6.5; n--)
{
gammaNative.push_back( atanf(L/sdd)-atanf(n*dDetX/sdd));
}
gammaNative.push_back(2*atanf(L/sdd));
if( !gammaNative.empty())
{
float lastBonM = gammaNative.back(); // ERROR HAPPENS HERE!!!
gammaNative.push_back( lastBonM +2*atanf(moduleGapX/2/sdd) );
}
......
}
int main()
{
vector<float> gammaNative;
GenerateNativeGamma( gammaNative, 1.02, 869.5, 2.087,47, 24);
}
我通过引用将向量传递给main()
的函数;目的是修改其中的向量。
然后我尝试获取最后一个元素via vector.back()
时出现“偏移超出范围”错误,如下图所示:
向量不为空,因此它应该有back()
。然后我不知道这里的问题是什么?或者这不是正确的方法,那么我应该如何修改另一个函数内的向量(动态)呢?非常感谢。
答案 0 :(得分:2)
请注意,调整向量的大小可能会导致底层数组被移动,从而使所有指针,引用和迭代器无效。当你将push_back推送到你通过引用传递的向量时,它可以调整大小,当然,引用将变为无效。
快速解决方法是在调用函数之前在向量上使用reserve,确保可以将足够的元素推送到它而无需重新分配。
更好的解决方案可能是返回副本。
编辑:一个简单的例子
vector<float> vec;
vec.reserve(50);
funcThatAdds50Floats(vec);