簡體   English   中英

打破; C ++:它實際上正在打破哪個循環

[英]break; C++: which loop is it actually breaking

關於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實例break了第二個(內部) 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中,可以使用lambda來就地執行它 - 因此不需要使用goto

C ++中的break語句將脫離直接放置breakforswitch語句。 在這種情況下,它將突破for (int j = ... loop。

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;

你正在打破你的第二個循環到你的第一個循環。

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

你可以在頂部設置一個布爾值

bool shouldBreak = false;

當你寫休息時,寫

shouldBreak = true;
break;

然后在循環結束時,每次檢查,

if (shouldBreak) break;
for (int i = 0; i < npts; i++)

你可以在頂部設置一個布爾值

bool shouldBreak = false;

當你想打破另一個循環時,寫下來

shouldBreak = true;
break;

使用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 ( int i = 0; i < int_container.size(); i++ )
{
    if ( int_container[i] == 1234 )
    {
        has1234 = true;
        break;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM