将变量声明移到 for 循环之外
moving variable declarations outside for loop
文件:bodies.cpp
for (int i=0; i<n; ++i) {
phys_vector pos{xdist(re), ydist(re)};
double mass = mdist(re);
body b{pos.x, pos.y, mass};
bodies.push_back(b);
}
文件:bodies.h
public:
bodies_aos() = default;
private:
std::vector<phys_vector> compute_forces(const simulation_parameters & param);
private:
std::vector<body> bodies;
};
我的意图是在循环外定义所有变量。我的方法(后来我发现它是不正确的,因为它没有 return 相同的结果)是以下方法:
bodies.cpp ->修改
int i;
double mass;
vector<phys_vector> pos;
std::vector<body> b;
for (i=0; i<n; ++i) {
phys_vector pos{xdist(re), ydist(re)};
mass = mdist(re);
body b{pos.x, pos.y, mass};
bodies.push_back(b);
}
不幸的是,由于变量初始化错误 b
and/or pos
,它没有 return 相同的结果,但它在编译时不会引发任何错误.
有谁知道如何解决这个问题以获得与第一种情况相同的结果?
- 您没有移动所有变量。
pos
和 b
仍然在循环内部定义,隐藏了外部定义(由于某种原因,外部 pos
变成了 vector<phys_vector>
)。外部变量在循环内未受影响,因此未按照您预期的方式进行初始化。
- 你不应该没有充分理由就这样做。变量的范围越小,您对代码的推理能力就越好。
我最好的猜测是你想要这样的东西
vector<phys_vector> pos;
for (int i=0; i<n; ++i) {
pos.emplace_back(xdist(re), ydist(re));
double mass = mdist(re);
bodies.emplace_back(pos.back().x, pos.back().y, mass);
}
// use pos and bodies
文件:bodies.cpp
for (int i=0; i<n; ++i) {
phys_vector pos{xdist(re), ydist(re)};
double mass = mdist(re);
body b{pos.x, pos.y, mass};
bodies.push_back(b);
}
文件:bodies.h
public:
bodies_aos() = default;
private:
std::vector<phys_vector> compute_forces(const simulation_parameters & param);
private:
std::vector<body> bodies;
};
我的意图是在循环外定义所有变量。我的方法(后来我发现它是不正确的,因为它没有 return 相同的结果)是以下方法:
bodies.cpp ->修改
int i;
double mass;
vector<phys_vector> pos;
std::vector<body> b;
for (i=0; i<n; ++i) {
phys_vector pos{xdist(re), ydist(re)};
mass = mdist(re);
body b{pos.x, pos.y, mass};
bodies.push_back(b);
}
不幸的是,由于变量初始化错误 b
and/or pos
,它没有 return 相同的结果,但它在编译时不会引发任何错误.
有谁知道如何解决这个问题以获得与第一种情况相同的结果?
- 您没有移动所有变量。
pos
和b
仍然在循环内部定义,隐藏了外部定义(由于某种原因,外部pos
变成了vector<phys_vector>
)。外部变量在循环内未受影响,因此未按照您预期的方式进行初始化。 - 你不应该没有充分理由就这样做。变量的范围越小,您对代码的推理能力就越好。
我最好的猜测是你想要这样的东西
vector<phys_vector> pos;
for (int i=0; i<n; ++i) {
pos.emplace_back(xdist(re), ydist(re));
double mass = mdist(re);
bodies.emplace_back(pos.back().x, pos.back().y, mass);
}
// use pos and bodies