Warum vector<bool> böse?
-
Hallo!
Man liest immer wieder irgendwo, dass
vector<bool>böse sei? Warum eigentlich? Bugs in Implementierungen? (Falls ja, welche Compiler?) Was sind die Alternativen?boost::dynamic_bitset?Grüße
-
Google auf die Schnelle: http://stackoverflow.com/questions/670308/alternative-to-vectorbool
-
Hm - ich sollte noch ergänzen, dass es für mich durchaus relevant ist, dass ein element auch nur ein bit braucht, also eine deque<bool> oder vector<char> kommt für mich nicht infrage.
-
Wusste ich gar nicht. Was geht mit vector<bool> denn schief?
-
TravisG schrieb:
Wusste ich gar nicht. Was geht mit vector<bool> denn schief?
Es gibt eine Spezialisierung, bei der die einzelnen Bools gepackt sind. Dadurch verhält er sich anders.
-
Die Probleme mit dem vector<bool> sind, um mal konkret zu werden, folgendes:
- Referenzen und Pointer auf die Elemente gehen schief.
- Die Iteratoren sind nicht random_acces, wie man es von einem vector erwarten würde. Nicht einmal bidirektional. Ich glaube sogar nicht einmal forward.
- Ide Algorithmen in der Standardbibliothek sind in der Regel so optimiert, als wäre ein Zugriff eine billige Aktion. Bei vector<bool> trifft diese Annahme nicht zu.
Das sollte es sein. Wenn du damit leben kannst: Schön für dich.
-
Wie, Iteratoren sind nicht Random-Access

Lese ich hier zum 1. mal. Wüsste auch nicht warum die nicht Random-Access sein sollten. Mir fallen auf die Schnelle nur Möglichkeiten ein die Iteratoren zu implementieren, wo man ganz einfach alle für Random-Access nötigen Operationen implementieren kann.
Also, die Iteratoren sind AFAIK schon Random-Access, nur sind es streng genommen keine Iteratoren (wegen Proxy und so)

-
hustbaer schrieb:
Wie, Iteratoren sind nicht Random-Access

Lese ich hier zum 1. mal. Wüsste auch nicht warum die nicht Random-Access sein sollten. Mir fallen auf die Schnelle nur Möglichkeiten die Iteratoren zu implementieren, wo man ganz einfach alle für Random-Access nötigen Operationen implementieren kann.
Also, die Iteratoren sind AFAIK schon Random-Access, nur sind es streng genommen keine Iteratoren (wegen Proxy und so)

Ja, war vielleicht dumm ausgedrückt und daher missverständlich.
-
Gerade weil dieses Thema sehr alt ist und sofort von den Suchmaschinen gefunden wird:
"böse" oder "bad" kann man wirklich nicht sagen - das wäre ziemlich weit aus dem Fenster gelehnt - "opinionated" sozusagen.
Ggf.(eher höchstwahrscheinlich!!!) ist die STL repariert worden. Jedenfalls nutze ich einen std::vector<bool> nur unter sehr bestimmten Umständen - diese erfordern in der Regel keine Element-Referenzen/-Zeiger, deswegen kann ich zur Aussage "Referenzen und Pointer auf Elemente gehen schief" nichts beitragen ausser. "Und sonst?".
Andererseits ist es schon wichtig, die Frage "warum überhaupt ein vector<bool>, kommt nichts Anderes in Frage?" zu stellen.
Dennoch ist die Schwarz - oder - Weiss - Frage bei std::vector<bool> nicht so offensichtlich "schwarz", wie vor 15 Jahren behauptet.
-
Ich hab gerad aufs Datum geguckt, und 9/11 gelesen.
Aber die Frage war ja 10 Jahre danach.Aber mal für blöde: Warum sollte man
vector<bool>nicht verwenden?
-
@Anon-81275 std::vector<bool> ist optimiert um weniger Speicher zu verbrauchen. Darum verhält der sich anders als man es von einem std::vector erwartet. Zum Beispiel gibt der [] Operator keine Referenz zurück.
Das heißt nicht, dass ein bool Vektor böse ist. Wenn man den haben will, kann man den nutzen. Aber man stolpert gerne über eben die Unterschiede, die für den unbedarften Nutzer im Zweifel unerwartet sind.
-
@Schlangenmensch Hat C++ nicht so etwas wie ein
bitset?Edit: Ah, sorry, blöde Frage... https://www.geeksforgeeks.org/cpp/cpp-bitset-and-its-application/