13

关于 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循环。

是这样吗?

4

5 回答 5

32

C++ 中的 break 语句将脱离直接放置 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++ 中没有办法让 break 目标指向任何其他循环。为了打破父循环,您需要使用其他一些独立的机制,例如触发结束条件。

此外,如果您想退出多个内部循环,您可以将该循环提取到一个函数中。在 C++ 11 中,可以使用 lambdas 就地执行此操作 - 因此无需使用goto

于 2012-05-14T16:19:06.640 回答
5

C++ 中的break语句将脱离直接放置的fororswitch语句。break在这种情况下,它将跳出for (int j = ...循环。

在 C++ 中没有办法以break任何其他循环为目标。为了打破父循环,您需要使用其他一些独立的机制,例如触发结束条件。

// Causes the next iteration of the 'for (int i ...' loop to end the loop)
i = npts;

// Ends the 'for (int j ...' loop
break;
于 2012-05-14T16:19:06.343 回答
3

您正在从第二个循环跳到第一个循环。

for (int i=0; i<npts; i++)

你可以在顶部设置一个布尔值

bool shouldBreak = false;

当你写break时,写

shouldBreak = true;
break;

然后在循环结束时,每次检查,

if (shouldBreak) break;
于 2012-05-14T16:19:51.227 回答
0
for (int i = 0; i < npts; i++)

你可以在顶部设置一个布尔值

bool shouldBreak = false;

当你想打破另一个循环时,写

shouldBreak = true;
break;
于 2013-05-25T04:33:01.810 回答
0

使用break

break将打破它当前所在的任何重复或迭代循环。这个详细的图像指南旨在突出break的行为,而不是说明良好的编码实践。内部 for 循环就足够了,但就像我说的,这是出于视觉目的:

双迭代循环

替代建议

使用 Modern C++ 中可用的各种搜索算法<algorithm>来搜索容器,并在某种程度上搜索字符串。这样做的原因有两个:

  1. 更短更易阅读的代码
  2. 通常和你自己写的任何东西一样快

这些代码示例将需要相同的样板,<algorithm>但较旧的 for 循环搜索除外:

#include <vector>
#include <algorithm>

std::vector<int> int_container = { 10, 23, 10345, 432, 2356, 999, 1234, 0x45f };
bool has1234 = false;

现代方式是这样的,我们快速搜索容器,如果搜索迭代器不在容器的最后(不是最后一个元素),我们知道它正在搜索的值是位于

对于用户编写的代码,此代码以更少的行数和更少的潜在故障点实现了相同的结果,就像它下面的旧替代方案一样。

现代 C++ 风格

auto search_position = std::find( int_container.begin(), int_container.end(), 1234 ) ;
if ( search_position != int_container.end() )
    has1234 = true;

C++11 基于范围的 for 循环

for ( auto i : int_container )
{
    if ( i == 1234 )
    {
        has1234 = true;
        break;
    }
}

老式 C 风格的 for 循环:

for ( int i = 0; i < int_container.size(); i++ )
{
    if ( int_container[i] == 1234 )
    {
        has1234 = true;
        break;
    }
}
于 2018-06-13T04:10:41.957 回答