关于C ++代码的简单问题:
for(int i=0;i<npts;i++)
{
for(int j=i;j<2*ndim;j++)
{
if(funcEvals[i]<bestListEval[j])
{
bestListEval[j] = funcEvals[i];
for(int k=0;k<m_ndim;k++)
bestList[j][k] = simplex[i][k];
break;
}
}
}
我想确保
double **simplex
行都会在double **bestList
break
实例突破了第二个(内部)for
循环。是这样的吗?
答案 0 :(得分:32)
C ++中的break语句将脱离直接放置中断的for或switch语句。它打破了最内层的结构(循环或开关)。在这种情况下:
for(int i=0;i<npts;i++)
{
for(int j=i;j<2*ndim;j++)
{
if(funcEvals[i]<bestListEval[j])
{
bestListEval[j] = funcEvals[i];
for(int k=0;k<m_ndim;k++)
bestList[j][k] = simplex[i][k];
break;
}
}
// after the 'break' you will end up here
}
C ++中没有办法让任何其他循环中断目标。为了打破父循环,你需要使用一些其他独立的机制,比如触发结束条件。
此外,如果要退出多个内循环,可以将该循环提取到函数中。在C ++ 11中,可以使用lambda来就地执行它 - 因此不需要使用 goto 。
答案 1 :(得分:5)
C ++中的break
语句将脱离直接放置for
的{{1}}或switch
语句。在这种情况下,它将突破break
循环。
C ++中没有办法让for (int j = ...
针对任何其他循环。为了打破父循环,你需要使用一些其他独立的机制,比如触发结束条件。
break
答案 2 :(得分:4)
你正在摆脱第二次循环到第一次循环。
for (int i=0; i<npts; i++)
您可以在顶部设置布尔值
bool shouldBreak = false;
当你写休息时,写下
shouldBreak = true;
break;
然后在循环结束时,每次检查,
if (shouldBreak) break;
答案 3 :(得分:1)
for (int i = 0; i < npts; i++)
您可以在顶部设置布尔值
bool shouldBreak = false;
当你想打破另一个循环时,写下
shouldBreak = true;
break;
答案 4 :(得分:1)
break
break
将打破它当前所处的重复或迭代循环。这个详细的图像指南旨在强调break
的行为,而不是说明良好的编码实践。内部for循环已经足够了,但就像我说的,这是出于视觉目的:
使用现代C ++在<algorithm>
中提供的各种搜索算法来搜索容器,并在某种程度上搜索字符串。原因有两个:
对于较旧的for循环搜索,这些代码示例将需要相同的样板,但<algorithm>
除外:
#include <vector>
#include <algorithm>
std::vector<int> int_container = { 10, 23, 10345, 432, 2356, 999, 1234, 0x45f };
bool has1234 = false;
现代的方式是这样的,我们快速搜索容器,如果搜索迭代器不在容器的最后(不最后一个元素),我们知道它正在搜索的值。
此代码实现了相同的结果,用户编写的代码的线路更少,潜在的故障点更少,就像下面的旧代码一样。
auto search_position = std::find( int_container.begin(), int_container.end(), 1234 ) ;
if ( search_position != int_container.end() )
has1234 = true;
for ( auto i : int_container )
{
if ( i == 1234 )
{
has1234 = true;
break;
}
}
for ( int i = 0; i < int_container.size(); i++ )
{
if ( int_container[i] == 1234 )
{
has1234 = true;
break;
}
}