3 Stimmen

Verwendung eines booleschen Wertes "das erste Mal" in C++ oder Java

Ich benutze normalerweise ein boolsches 'ersteMal' so:

in C++:

bool ersteMal = true;
for (int i = 0; i < v.size(); i++) {
    if (ersteMal) {
        //etwas nur einmal machen
        ersteMal = false;
    }
    else {
        //das Übliche tun
    }
}

in Java wäre es dasselbe, indem man statt einem bool ein boolean verwendet, daher gebe ich den Code nicht an.

Die Frage ist, gibt es irgendwie in Java oder C/C++ eine Möglichkeit, ein bool/boolean in einer if-Bedingung zu verwenden und automatisch den Wert false zuzuweisen?

Ich weiß, es scheint unsinnig, aber es würde meinen Code VIEL Zeilen sparen, weil ich viele Basisfälle habe und in großen for- oder while-Schleifen ist das kritisch.

Ich möchte wissen, ob es irgendwie möglich ist, einem Wert nach der Verwendung in einer if-Bedingung den Wert false zuzuweisen. Ich weiß, dass wir in einem for oder while einfach verwenden können:

if (i == 0)

Aber ich habe auch an Funktionsaufrufe gedacht, die Dinge wissen müssen und die normalerweise durch bools referenziert werden.

7voto

Luchian Grigore Punkte 244505

Ich würde einfach die Bedingung ändern zu

if ( i == 0 )
{ 
}
//...

und die zusätzliche Variable ganz loswerden.

EDIT Nachdem ich alle Vorschläge gesehen habe, wie man dies in einer Zeile machen könnte, komme ich nur zu einem Schluss - MACH ES NICHT. Verwende einfach, was du hast, es ist viel viel klarer.

4voto

Peter Lawrey Punkte 511323

Wenn Sie noch keinen Zähler haben, können Sie stattdessen einen verwenden anstelle eines booleschen Wertes

long counter = 0;
for(String arg: args) {
    if(counter++ == 0) {
       // first
    }
}

Ein Alternativ, der einen booleschen Wert verwendet, ist

boolean first = true;
for(String arg: args) {
    if(first && !(first = false)) {
       // first
    }
}

Für Sets gibt es ein ähnliches Muster

Set seen = ...
for(String arg: args) {
    if(seen.add(arg)) {
       // das erste Mal für diesen Wert von arg, da er nur einmal hinzugefügt wird.
    }
}

4voto

Sergey Kalinichenko Punkte 694383

Es gibt eine C++ - spezifische Lösung, die den Konvertierungsoperator verwendet, um einen einmaligen Guard zu erstellen:

class first_guard {
    bool val;
public:
    first_guard() : val(true) {}
    operator bool() { bool res = val; val = false; return res; }
};

So verwenden Sie den Guard:

first_guard first;
for (int i = 0 ; i != 5 ; i++) {
    if(!first) {
        cout << i << ' ';
    }
}

Dieser Code druckt 1 2 3 4 aus und überspringt 0.

Mangel an Konvertierungsoperatoren verhindert, dass Sie diese Lösung in Java replizieren können.

2voto

David Schwartz Punkte 172718
for (int i = 0, firstTime = 1; i < v.size(); i++, firstTime = 0) {

1voto

Ross Larson Punkte 2297

Bearbeiten: Siehe Luchians Bearbeitung bezüglich der Verwendung dessen, was Sie haben. Ich bin einverstanden. Es ist sehr klar.

Warum ziehen Sie nicht die erste Schleifeniteration aus der Schleife heraus?

//tue etwas nur einmal (falls erforderlich, also überprüfe)
for (int i = 1; i < v.size(); i++) {
    //tue das Übliche
}

Wenn es eine Chance gibt, dass Sie dies möglicherweise nicht als erstes tun, müssten Sie das überprüfen, aber oft werden Sie wahrscheinlich zumindest eine Iteration durchführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X