Wahrheitstafel, Code unschön
-
Hallo!
Ich möchte eine Wahrheitstafel auf der Konsole ausgeben.
Dazu habe ich zwei Schleifen die jede Variablenbelegung durchgehen sollen.typedef std::map<char, bool> mapTyp;
Variablen ist eine obige map, in der jede, in einer bel. Formel vorkommenden, Variable gespeichert wird.
for(int i = 0; i < pow(2, Variablen.size()); i++) { mapTyp::iterator iter = Variablen.begin(); for(int k = 1; iter != Variablen.end(); iter++) { if((i%static_cast<int>(pow(2, Variablen.size()-k)))==0) { iter->second=!(iter->second); } k++; } }
(Funktioniert!)
Aber:
Hier gefällt mir nicht, dass ich innerhalb der zweiten for-Schleife zwei versch. Variablen brauche (k und iter). Iter wird außerhalb der Schleife nämlich eigentlich auch nicht benötigt.Wie kann man das jetzt schöner machen?
Grüße
-
k lässt sich aus dem Iterator (k=iter-1) berechnen. Kannste natürlich machen, um die Variable zu sparen, aber ob das nun leichter zu lesen ist, ist wohl Geschmackssache.
for(int i = 0; i < pow(2, Variablen.size()); i++) { for(mapTyp::iterator iter = Variablen.begin(); iter != Variablen.end(); iter++) { if((i%static_cast<int>(pow(2, Variablen.end() - iter - 1))==0) { iter->second=!(iter->second); } } }
-
Hallo!
Danke für die Antwort.Leider funktioniert das nicht, Meldung:
error: no match for ‘operator-’ in ‘Wahrheitstafel::Variablen.std::map<_Key, _Tp, _Compare, _Alloc>::end [with _Key = char, _Tp = bool, _Compare = std::less<char>, _Alloc = std::allocator<std::pair<const char, bool> >]() - iter’|
(Variablen.end() - iter - 1)
ist aber doch auch ein Iterator und keine Zahl, oder?
Grüße
-
Ah, sorry, das geht natürlich nur mit RandomAccessIteratoren (wie z.B. beim vector). Bei der Map hat man ja aber nurn nen BidirectionalIterator, womit so eine Arithmetik nicht geht.
Es geht also:
std::map<int,int>::iterator i; i++;
und das auch:
std::vector<int>::iterator i; i+=1234;
aber das geht nicht:
std::map<int,int>::iterator i; i+=1234;
Dann fällt mir jetzt auch nicht ein, wie du dein k loswirst.
Ein std::vector<std::pair<char, bool> > ist wohl keine Option, oder? Dann würde das hier nämlich gehen.
typedef std::vector<std::pair<char, bool> > mapTyp; mapTyp Variablen; for(int i = 0; i < pow(2, Variablen.size()); i++) { mapTyp::iterator iter = Variablen.begin(); for(int k = 1; iter != Variablen.end(); iter++) { if((i%static_cast<int>(pow(2, Variablen.end() - iter - 1)))==0) { iter->second=!(iter->second); } k++; } }
-
assert(Variablen.size() > 0); for(int i = 0; i < (1 << Variablen.size()); i++) { mapTyp::iterator iter; for(iter = Variablen.begin(); iter->second; ++iter) { iter->second = false; } iter->second = true; print(Variablen); }