web-dev-qa-db-ja.com

ブレーク; C ++:実際に壊れているループ

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に最大1回挿入されます
  • ここでのbreakのインスタンスは、2番目の(内部)forループから抜け出します。

これは事実ですか?

13
kiriloff

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++では、他のループをブレークターゲットにする方法はありません。親ループから抜け出すには、終了条件のトリガーなど、他の独立したメカニズムを使用する必要があります。

また、複数の内部ループを終了する場合は、そのループを関数に抽出できます。 C++ 11では、ラムダを使用してインプレースで実行できます。したがって、gotoを使用する必要はありません。

33
Sergey K.

C++のbreakステートメントは、forが直接配置されているswitchまたは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;
5
JaredPar

2番目のループから最初のループに脱出しています。

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

上にブール値を設定できます

bool shouldBreak = false;

あなたが休憩を書くとき、書く

shouldBreak = true;
break;

次に、ループの最後で、毎回確認します。

if (shouldBreak) break;
4
Martol1ni

breakの使用

breakは、現在内部にある繰り返しループまたは反復ループから抜け出します。この詳細な画像ガイドは、breakの動作を強調することを目的としており、適切なコーディング方法を示しているわけではありません。内部のforループで十分ですが、前述のように、これは視覚的な目的のためです。

double-iterating-loops

代替アドバイス

<algorithm>で利用可能なModern C++のさまざまな検索アルゴリズムを使用して、コンテナーおよびある程度まで文字列を検索します。この理由は2つあります。

  1. 短くて読みやすいコード
  2. 通常、自分で書いたものよりも速くなくても同じくらい速い

これらのコードサンプルには、古いforループ検索の<algorithm>を除いて、同じボイラープレートが必要です。

#include <vector>
#include <algorithm>

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

現代の方法はこのようなもので、コンテナーをすばやく検索し、search-iteratorがコンテナーの最後にない場合not最後の要素)、検索している値が見つかったことがわかります

このコードは、その下の古い代替のように、ユーザー作成コードの行数と潜在的な障害点が少なく、同じ結果を実現します。

最新の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;
    }
}
1
for (int i = 0; i < npts; i++)

上にブール値を設定できます

bool shouldBreak = false;

そして、他のループを壊したいときは、

shouldBreak = true;
break;
1

if/else/while/forの後に括弧がない場合、if/else/for/whileに続く最初の行のみが実行されるため、ループは次のようになります。

for(int k=0;k<m_ndim;k++)

ループするのは次の行だけです。

 bestList[j][k] = simplex[i][k];

したがって、病棟後のbreakステートメントは、何の影響も及ぼしません。 break;を使用してループから抜け出し、ステートメントを切り替えると考えると、breakステートメントは次のものに適用されます。

for(int j=i;j<2*ndim;j++)
0
Gox