Warum vector<bool> böse?



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

    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/



  • @Anon-81275
    Nachteil ist aber, dass ein STL-bitset eine feste Länge besitzt... Ich verstehe nicht, wieso man hier in den sauren Apfel beißen muss - es also kein Konstrukt gibt, das dynamisch wäre und gleichzeitig nicht referenzieren würde. 😞

    Die STL von C++ scheint mir in mancher Hinsicht nicht ausgegoren.



  • @Anon-81275 Es gibt da einen, häufig übersehenen, Container der std: die std::deque. Damit kannst du auch auf bool arbeiten, wie du es erwarten würdest.



  • Jaaa, und auch wahlfreier Zugriff, so man möchte. 🤩 Das ist in Java anders...

    Ich denke, Thema gelöst.



  • Ok, es bleibt aber noch die Frage, weshalb sich std::vector und std::deque mit bool unterschiedlich verhalten... Die KI/Gemini sagt, das sei ein Designfehler gewesen, der etwa in den 90ern entstand: https://share.google/aimode/G379HXv4qLhKlCpn4

    Der grundlegende Unterschied liegt darin, dass std::vector<bool> eine explizite Template-Spezialisierung in der C++-Standardbibliothek ist, während std::deque<bool> ein ganz normaler Container bleibt. In den 1990er-Jahren wollte das C++-Komitee demonstrieren, wie mächtig Templates für "unsichtbare Optimierungen" sein können. Das führte zu einer Entscheidung, die heute von vielen Experten als Design-Fehler angesehen wird.

    Käse. 🧀 ... bzw. ein Detail, das man kennen sollte.


Anmelden zum Antworten