2016-08-02 2 views
-1

Я повторяю через std::map дважды с помощью внешнего цикла for и вложенного цикла for. Я хочу остановить внутренний цикл, когда условие выполнено. Я знаю, что если я позвоню, это остановит оба цикла. Я не хочу этого. Я хочу только остановить внутренний цикл for.Как остановить цикл for, продвигая итератор std :: map?

Мой фрагмент кода, как показано ниже:

for(auto markerCounter = ellipsePropertiesMap.begin(); markerCounter != ellipsePropertiesMap.end(); markerCounter++) 
    {          
     for(auto markerCounter2 = ellipsePropertiesMap.begin(); markerCounter2 != ellipsePropertiesMap.end(); markerCounter2++) 
     { 
      if(conditionMet) 
      std::advance(markerCounter2, ellipsePropertiesMap.size()); 
      //I also tried the following: 
      //markerCounter2 = ellipsePropertiesMap.end(); 
      //markerCounter2++; 
     } 
    } 

Я пытаюсь остановить внутренний цикл, продвигая итератор по размеру станд :: карта, но она не работает. Я также попытался получить конечный итератор и продвинуть его, чтобы закончить цикл. Видимо, это тоже не работает.

Итак, как я могу фактически остановить внутренний цикл?

Спасибо.

+9

'break' влияет только на один цикл – DimChtz

+0

Насколько сложным является условие? Вам нужно сделать что-нибудь особенное, если условие встречается, кроме окончания цикла? Часто это может быть добавлено к условию самой части цикла. – NathanOliver

ответ

7

Я хочу остановить внутренний цикл, когда условие выполнено.

break сделаю это точно.

В качестве альтернативы, вы можете сделать это условие частью условия цикла.

Я знаю, что если я позвоню перерыв, он остановит оба цикла.

Вы знали, что не так.


std::advance(markerCounter2, ellipsePropertiesMap.size()); 

Это было бы справедливо, если и только если markerCounter2 == ellipsePropertiesMap.begin(). Если условие выполняется на любой другой итерации, чем первая, вы увеличиваете итератор за концом и имеете неопределенное поведение. Кроме того, это продвижение итератора не выходит из тела цикла, которое будет выполняться до тех пор, пока условие цикла не будет проверено в следующий раз.

markerCounter2 = ellipsePropertiesMap.end(); 

Это позволило бы дис-удовлетворяют условию цикла, в результате чего цикл, чтобы остановить в конце текущей итерации. Однако выполнение

markerCounter2++; 

после того, как будет снова увеличиваться в конце прошлого и есть UB.

Смежные вопросы