[英]How to add a vector to a vector of vectors inside functions in c++
我试图尝试将一个向量添加到函数内部的向量的向量中:该函数将向量的向量作为指针(称为r)并将其添加到r另一个向量。
std::vector<double> b;
b.push_back(0);
b.push_back(0);
b.push_back(0);
b.push_back(v0*sin(theta));
b.push_back(0);
b.push_back(v0*cos(theta));
b.push_back(0);
cout<<"befor"<<endl;
(*r).push_back(b);
cout<<"after"<<endl;
但是,当尝试将b添加到r时,该函数崩溃。 我相信这是因为b是一个内部对象,但是为什么程序在尝试添加b而不是之后(当函数结束时)崩溃? 为了检查这一点,我添加了打印行“ before”和“ after”(它打印“ before”,但不打印“ after”,然后崩溃)。
谁能向我解释将向量添加到函数内部向量的最佳方法是什么?
完整功能如下所示:
void solve_all(double v0,double theta,double omega,double phi,double
dt_in,double total_time,std::string solver, double eps_in,
std::vector<std::vector<double>>* r)
{
double delta,eta,miu,diff,time,eps_f,dt_f,eps_t;
std::vector<double> r_1(7),r_2(7),r_temp(7);
int i,good;
mone_f=0;
std::vector<double> b;
b.push_back(0);
b.push_back(0);
b.push_back(0);
b.push_back(v0*sin(theta));
b.push_back(0);
b.push_back(v0*cos(theta));
b.push_back(0);
cout<<"befor"<<endl;
(*r).push_back(b);
cout<<"after"<<endl;
i=1;
time=b[6];
dt_f=dt_in;
eps_f=eps_in;
delta=eps_f*dt_f/(total_time-time);
eta=delta/4;
miu=delta/2;
eps_t=1e-10;
while(total_time-time>eps_t)
{
cout<<time<<endl;
good=0;
while(good==0)
{
if(dt_f>total_time-time){dt_f=total_time-time;}
solve(&b,&r_1,dt_f,omega,phi,solver);
solve(&b,&r_temp,dt_f/2,omega,phi,solver);
solve(&r_temp,&r_2,dt_f/2,omega,phi,solver);
diff=0;
for(int j=0; j<=5; j++)
{
double subs;
subs=r_2[j]-r_1[j];
if(subs<0){subs=subs*(-1);}
if(subs>diff){diff=subs;}
}
if(diff>delta)
{
dt_f=dt_f/2;
}
else
{
if(miu<diff&&diff<delta)
{
good=1;
dt_f=0.9*dt_f;
}
else
{
if(eta<diff&&diff<miu)
{
good=1;
}
else
{
if(eta>diff)
{
good=1;
dt_f=1.1*dt_f;
}
}
}
}
i++;
b.clear();
if(solver.compare("RK2"))
{
for(int j=0; j<=6;i++)
{
b.push_back((4*r_2[j]-r_1[j])/3);
}
}
if(solver.compare("RK3"))
{
for(int j=0; j<=6;i++)
{
b.push_back((8*r_2[j]-r_1[j])/7);
}
}
(*r).push_back(b);
eps_f=eps_f-diff;
time=b[6];
delta=eps_f*dt_f/(total_time-time);
eta=delta/4;
miu=delta/2;
}
}
}
相关功能:
double big_f(double v)
{
return (0.0039+0.0058/(1+exp((v-35)/5)));
}
double f1(double vx,double vy,double vz,double omega ,double phi)
{
double v;
mone_f++;
v=sqrt(pow(vx,2)+pow(vy,2)+pow(vz,2));
return (-big_f(v)*v*vx+B*omega*(vz*sin(phi)-vy*cos(phi)));
}
double f2(double vx,double vy,double vz,double omega ,double phi)
{
double v;
mone_f++;
v=sqrt(pow(vx,2)+pow(vy,2)+pow(vz,2));
return (-big_f(v)*v*vy+B*omega*(vx*cos(phi)));
}
double f3(double vx,double vy,double vz,double omega ,double phi)
{
double v;
mone_f++;
v=sqrt(pow(vx,2)+pow(vy,2)+pow(vz,2));
return (-g-big_f(v)*v*vz-B*omega*(vx*sin(phi)));
}
void solve(std::vector<double>* r,std::vector<double>* r_new,double
l,double omega, double phi, std::string solver)
{
double vx,vy,vz,vx2,vy2,vz2,vx3,vy3,vz3;
if (solver.compare("RK2")==0)
{
vx=(*r)[3];
vy=(*r)[4];
vz=(*r)[5];
vx2=vx+0.5*l*f1(vx,vy,vz,omega,phi);
vy2=vy+0.5*l*f2(vx,vy,vz,omega,phi);
vz2=vz+0.5*l*f3(vx,vy,vz,omega,phi);
(*r_new).push_back((*r)[0]+l*vx2);
(*r_new).push_back((*r)[1]+l*vy2);
(*r_new).push_back((*r)[2]+l*vz2);
(*r_new).push_back((*r)[3]+l*f1(vx2,vy2,vz2,omega,phi));
(*r_new).push_back((*r)[4]+l*f2(vx2,vy2,vz2,omega,phi));
(*r_new).push_back((*r)[5]+l*f3(vx2,vy2,vz2,omega,phi));
(*r_new).push_back((*r)[6]+l);
}
if(solver.compare("RK3")==0)
{
vx=(*r)[3];
vy=(*r)[4];
vz=(*r)[5];
vx2=vx+0.5*l*f1(vx,vy,vz,omega,phi);
vy2=vy+0.5*l*f2(vx,vy,vz,omega,phi);
vz2=vz+0.5*l*f3(vx,vy,vz,omega,phi);
vx3=vx+2*l*f1(vx2,vy2,vz2,omega,phi)-l*f1(vx,vy,vz,omega,phi);
vy3=vy+2*l*f2(vx2,vy2,vz2,omega,phi)-l*f2(vx,vy,vz,omega,phi);
vz3=vz+2*l*f3(vx2,vy2,vz2,omega,phi)-l*f3(vx,vy,vz,omega,phi);
(*r_new).push_back((*r)[0]+l*(vx+4*vx2+vx3)/6);
(*r_new).push_back((*r)[1]+l*(vx+4*vx2+vx3)/6);
(*r_new).push_back((*r)[2]+l*(vx+4*vx2+vx3)/6);
(*r_new).push_back((*r)[3]+l(f1(vx,vy,vz,omega,phi)+4*f1(vx2,vy2,vz2,omega,phi)+f1(vx3,vy3,vz3,omega,phi))/6);
(*r_new).push_back((*r)[4]+l*(f2(vx,vy,vz,omega,phi)+4*f2(vx2,vy2,vz2,omega,phi)+f2(vx3,vy3,vz3,omega,phi))/6);
(*r_new).push_back((*r)[5]+l*(f3(vx,vy,vz,omega,phi)+4*f3(vx2,vy2,vz2,omega,phi)+f3(vx3,vy3,vz3,omega,phi))/6);
(*r_new).push_back((*r)[6]+l);
}
}
如果您使用参考std::vector<std::vector<double>>&
或指针std::vector<std::vector<double>>*
,则可以push_back
和返回任意数量的std::vector<double>
想。 是否回推堆栈变量都没有关系, push_back
创建一个副本。
您的问题可能是您的r
指针无效。 尝试检查它是否不是nullptr
,或者它是否指向超出范围的堆栈变量-在这种情况下确实很重要。 另外,最好将函数定义更改为引用,以查看编译器是否抱怨。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.