我有一个函数getfafr(N,n,twoq)
,它以fafr
的形式返回一个三维张量std::vector<vector<vector> > >
。它没有统一的大小(即fafr[i][j].size()
对于不同的i,j
等可能有所不同,这是使用push_back()
实现的。
奇怪的是,运行具有完全相同参数的函数会导致不同的张量;有时候至少有些元素是胡言乱语。一个例子是代码中的不同点同时运行getfafr(12,3,1)
给fafr[2][0][10]=270
而另一个给fafr[2][0][10]=-6.88461e-309
。
奇怪的是,如果我在使用std::cout
创建后始终将张量打印到屏幕上,问题就会消失。
我的感觉是以这种方式使用push_back()
可能会导致内存问题,比如之前的数据会被之前或之类的东西覆盖。这是功能:
vector<vector<vector<double> > > getfafr(int N, int n, int twoq) {
vector<vector<vector<double> > > fafr;
for(int nu=0;nu<n;nu++) {
fafr.push_back(vector<vector<double> >(twoq+nu+1));
for(int om=0;om<=twoq+nu;om++) {
for(int tmo=0;tmo<N-nu-twoq;tmo++) {
fafr[nu][om].push_back(bin(twoq+nu, om));
for(int i=N-tmo-nu-twoq;i<=N-1-tmo-om;i++) fafr[nu][om][tmo]*=i;
for(int i=tmo+1;i<=tmo+om;i++) fafr[nu][om][tmo]*=i;
}
}
}
return fafr;
}
答案 0 :(得分:1)
int main()
{
auto x = getfafr(12, 3, 1);
cout << x.size() << ' ' << x[2].size() << ' ' << x[2][0].size() << endl;
}
输出:
3 4 9
当您尝试访问fafr[2][0][10]
时,您将超出范围。将其更改为fafr.at(2).at(0).at(10)
(如评论中所示)可以帮助您。