跳过for循环的特定(指定)迭代
Skip particular (specified) iteration of for loop
我对C++很陌生,但我在网上找不到解决办法,我觉得可能有一个有趣、优雅的解决方案。
我最终试图为行星运动编写一个蛙跳算法。我定义了一个名为行星的类
Planet(double mass, double x0, double x1, double v0, double v1)
我有一个存储4个不同行星信息的阵列:
Planet planets[] = {
Planet(2.0, -0.5, 0, -0.94, 0.65),
Planet(1.0, -0.6, -0.2, 1.86, 0.7),
Planet(1.0, 0.5, 1.0, -0.44, -1.40),
Planet(0.4, 0.6, 0.3, 1.15, -1.50)
};
我要计算每一个行星上每一颗行星的重力。这涉及到实现行星i上的力的数学方程:F_i=i上的和=[(Gm_im_j)/r_ij]的j,其中i和j表示两个行星,j每次递增,r_ij表示两者之间的距离。
在我开始将其作为一个整体进行思考之前,我正在测试是否可以使用for循环从数组中选择一个特定的行星,以及从该行星中选择特定的组件,并打印出来。通过运行良好
for(int i=0; i<4; ++i){
cout << planets[i].getvx() << "n";
}
然而,我想尝试排除一个特定的行星,比如说我在计算j上的力,其中j=2。
for(int i=0; (i<j || i>j) && i<4; ++i){
cout << planets[i].getvx() << "n";
}
这个循环在2结束,只打印p[0]和p[1]的v0值(通过类定义),而不是我希望的p[3]。同样地,j=1只打印p[0]和p[1]的v0。
有没有一种方便的方法可以在for循环中设置一个满足我需求的条件,或者我应该重新思考我的方法?
为什么不试试这个
for(int i=0; i<4 ; ++i)
{
if( i != j )
cout << planets[i].getvx() << "n";
}
这是我能想到的最简单的方法,不需要尝试任何复杂的东西。您只需要在循环中检查i
是否等于j
。如果i
不等于j
,则给出输出。
如果你不想这样,那么你可以像其他答案中建议的那样使用continue
。
for(int i=0; i<4 ; ++i)
{
if ( i == j )
continue;
cout << planets[i].getvx() << "n";
}
只需将检查放入循环中即可:
for (int i=0; i<4; ++i) {
if (i!=j) {
cout << planets[i].getvx() << "n";
}
}
上面提出了很多建议,但为什么您的代码不起作用??
for(int i=0; (i<j || i>j) && i<4; ++i){
cout << planets[i].getvx() << "n";
}
记住,只要循环条件为true,循环就会继续执行;一旦循环条件变为false,循环将退出。您的环路条件为
(i<j || i>j) && i<4
若要使此表达式为true,"&&"两边的两个子表达式都必须为true。当i=j时,
(i<j || i>j)
表达式为false,所以循环条件为false,循环终止,正如您所观察到的那样。
在循环内部使用关键字continue。它强制循环的下一次迭代
if(i==j) continue;
如果真的坚持把它放在for meta中(而不是循环中),试试这个:
for (int i = 0; i < 4; i + 1 == j ? i++ : i += 2)
然而,使用if (i == j) continue;
可能是最干净的编写方法。
如果您希望循环在i == j
时跳过内部行为,请使用continue
关键字:
for (int i = 0; i < 4; i++) {
if (i == j) {
continue;
}
cout << planets[i].getvx() << "n";
}
这将导致跳过循环体。另一种方法是只在i != j
:时执行内部逻辑
for (int i = 0; i < 4; i++) {
if (i != j) {
cout << planets[i].getvx() << "n";
}
}
两种方式都能达到相同的目标。
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 从 QMap<K、T> 获取 Java 样式迭代器,而不指定 T、K
- C++ std::vector语言 - 如何修改迭代器指定的元素?
- 跳过for循环的特定(指定)迭代
- 如何检查迭代器指定的范围是否有效
- 将迭代器返回到多映射中最接近指定时间的时间
- 如何将任何容器的迭代器递增指定值
- 指定容器类型的迭代器类型的部分专门化
- For循环不迭代指定次数(少迭代1次)
- 为什么总是在std::for_each中指定迭代器?