2016-08-02 24 views
-1

Ich bin durch eine std::map zweimal durchlaufen mit einer äußeren for Schleife und einer verschachtelten for Schleife. Ich möchte die innere Schleife stoppen, wenn die Bedingung erfüllt ist. Ich weiß, wenn ich Pause nenne, wird es beide Schleifen stoppen. Ich will das nicht. Ich möchte nur die innere for Schleife stoppen.Wie kann ich eine for-Schleife stoppen, indem ich den std :: map-Iterator vorschiebe?

Mein Code-Schnipsel ist wie folgt:

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++; 
     } 
    } 

Ich versuche, die inneren for-Schleife zu stoppen, indem das Iterator durch die Größe des std :: map voran, aber es funktioniert nicht. Ich habe auch versucht, den End-Iterator zu bekommen und ihn weiter zu bringen, um die Schleife zu beenden. Anscheinend funktioniert das auch nicht.

Also, wie kann ich eigentlich die innere Schleife stoppen?

Danke.

+9

'break' betrifft nur eine Schleife – DimChtz

+0

Wie komplex ist die Bedingung? Müssen Sie etwas Besonderes tun, wenn die Bedingung erfüllt ist und die Schleife endet? Oftmals kann es dem Bedingungsteil der Schleife selbst hinzugefügt werden. – NathanOliver

Antwort

7

Ich möchte die innere Schleife stoppen, wenn die Bedingung erfüllt ist.

break wird genau das tun.

Alternativ können Sie diese Bedingung möglicherweise in den Schleifenzustand aufnehmen.

Ich weiß, dass, wenn ich Pause anrufe, es beide Schleifen stoppt.

Sie wussten falsch.


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

Dies würde, wenn und nur wenn markerCounter2 == ellipsePropertiesMap.begin() gültig sein. Wenn die Bedingung bei einer anderen Iteration als der ersten erfüllt ist, erhöhen Sie den Iterator nach dem Ende und haben ein nicht definiertes Verhalten. Dieser Iterator-Vorschub bricht auch nicht aus dem Schleifenkörper aus, der ausgeführt wird, bis die Schleifenbedingung für das nächste Mal überprüft wird.

markerCounter2 = ellipsePropertiesMap.end(); 

Dies würde dis-erfüllt die Schleifenbedingung, die Schleife verursacht am Ende der laufenden Iteration zu beenden. Jedoch Ausführung

markerCounter2++; 

, nachdem es wieder über das Ende erhöhen würde und haben UB.