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
ループから抜け出します。これは事実ですか?
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を使用する必要はありません。
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;
2番目のループから最初のループに脱出しています。
for (int i=0; i<npts; i++)
上にブール値を設定できます
bool shouldBreak = false;
あなたが休憩を書くとき、書く
shouldBreak = true;
break;
次に、ループの最後で、毎回確認します。
if (shouldBreak) break;
break
の使用break
は、現在内部にある繰り返しループまたは反復ループから抜け出します。この詳細な画像ガイドは、break
の動作を強調することを目的としており、適切なコーディング方法を示しているわけではありません。内部のforループで十分ですが、前述のように、これは視覚的な目的のためです。
<algorithm>
で利用可能なModern C++のさまざまな検索アルゴリズムを使用して、コンテナーおよびある程度まで文字列を検索します。この理由は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最後の要素)、検索している値が見つかったことがわかります。
このコードは、その下の古い代替のように、ユーザー作成コードの行数と潜在的な障害点が少なく、同じ結果を実現します。
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;
}
}
for (int i = 0; i < npts; i++)
上にブール値を設定できます
bool shouldBreak = false;
そして、他のループを壊したいときは、
shouldBreak = true;
break;
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++)