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





  • 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.


  • Mod

    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) 😃


  • Mod

    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. Also nur 15 Jahre (und etliche Kriege...) später.

    Aber mal für blöde: Warum sollte man vector<bool> nicht verwenden?


Anmelden zum Antworten