Namespaces
Variants

std:: vector<bool>

From cppreference.net
Definiert im Header <vector>
template <

class Allocator

> class vector < bool , Allocator > ;

std :: vector < bool > ist eine möglicherweise speichereffiziente Spezialisierung von std::vector für den Typ bool .

Die Art und Weise, in der std :: vector < bool > speicherplatzeffizient gestaltet wird (sowie ob überhaupt optimiert wird), ist implementierungsdefiniert. Eine mögliche Optimierung besteht darin, Vektorelemente so zusammenzufassen, dass jedes Element ein einzelnes Bit belegt anstatt sizeof ( bool ) Bytes.

std :: vector < bool > verhält sich ähnlich wie std::vector , aber um speichereffizient zu sein, tut es Folgendes:

  • Speichert seine Elemente nicht unbedingt als zusammenhängendes Array.
  • Stellt die Klasse std :: vector < bool > :: reference als Methode zum Zugriff auf einzelne Bits bereit. Insbesondere werden Objekte dieser Klasse von operator[] als Wert zurückgegeben.
  • Verwendet nicht std :: allocator_traits :: construct zum Konstruieren von Bit-Werten.
  • Garantiert nicht, dass verschiedene Elemente im selben Container gleichzeitig von verschiedenen Threads geändert werden können.

Inhaltsverzeichnis

Mitgliedertypen

Mitgliedertyp Definition
value_type bool
allocator_type Allocator
size_type implementierungsdefiniert
difference_type implementierungsdefiniert
Proxy-Klasse, die eine Referenz auf einen einzelnen bool repräsentiert
(Klasse)
const_reference bool
pointer implementierungsdefiniert
const_pointer implementierungsdefiniert
iterator

implementierungsdefiniert

(bis C++20)

implementierungsdefiniert ConstexprIterator

(seit C++20)
const_iterator

implementierungsdefiniert

(bis C++20)

implementierungsdefiniert ConstexprIterator

(seit C++20)
reverse_iterator std:: reverse_iterator < iterator >
const_reverse_iterator std:: reverse_iterator < const_iterator >

Memberfunktionen

konstruiert den vector
(öffentliche Elementfunktion von std::vector<T,Allocator> )
zerstört den vector
(öffentliche Elementfunktion von std::vector<T,Allocator> )
weist dem Container Werte zu
(öffentliche Elementfunktion von std::vector<T,Allocator> )
weist dem Container Werte zu
(öffentliche Elementfunktion von std::vector<T,Allocator> )
weist dem Container einen Wertebereich zu
(öffentliche Elementfunktion von std::vector<T,Allocator> )
gibt den zugehörigen Allokator zurück
(öffentliche Elementfunktion von std::vector<T,Allocator> )
Elementzugriff
Zugriff auf bestimmtes Element mit Grenzprüfung
(öffentliche Elementfunktion von std::vector<T,Allocator> )
Zugriff auf spezifisches Element
(öffentliche Elementfunktion von std::vector<T,Allocator> )
greift auf das erste Element zu
(öffentliche Elementfunktion von std::vector<T,Allocator> )
greift auf das letzte Element zu
(öffentliche Elementfunktion von std::vector<T,Allocator> )
Iteratoren
gibt einen Iterator zum Anfang zurück
(öffentliche Elementfunktion von std::vector<T,Allocator> )
(C++11)
gibt einen Iterator zum Ende zurück
(öffentliche Elementfunktion von std::vector<T,Allocator> )
gibt einen Reverse-Iterator zum Anfang zurück
(öffentliche Elementfunktion von std::vector<T,Allocator> )
(C++11)
gibt einen umgekehrten Iterator zum Ende zurück
(öffentliche Elementfunktion von std::vector<T,Allocator> )
Kapazität
prüft, ob der Container leer ist
(öffentliche Elementfunktion von std::vector<T,Allocator> )
gibt die Anzahl der Elemente zurück
(öffentliche Elementfunktion von std::vector<T,Allocator> )
gibt die maximal mögliche Anzahl von Elementen zurück
(öffentliche Elementfunktion von std::vector<T,Allocator> )
reserviert Speicherplatz
(öffentliche Elementfunktion von std::vector<T,Allocator> )
gibt die Anzahl der Elemente zurück, die im aktuell allozierten Speicher gehalten werden können
(öffentliche Elementfunktion von std::vector<T,Allocator> )
Modifikatoren
löscht den Inhalt
(öffentliche Elementfunktion von std::vector<T,Allocator> )
fügt Elemente ein
(öffentliche Elementfunktion von std::vector<T,Allocator> )
fügt eine Reihe von Elementen ein
(öffentliche Elementfunktion von std::vector<T,Allocator> )
fügt eine Reihe von Elementen am Ende hinzu
(öffentliche Elementfunktion von std::vector<T,Allocator> )
(C++11)
Konstruiert Element direkt an Ort und Stelle
(öffentliche Elementfunktion von std::vector<T,Allocator> )
löscht Elemente
(öffentliche Elementfunktion von std::vector<T,Allocator> )
fügt ein Element am Ende hinzu
(öffentliche Elementfunktion von std::vector<T,Allocator> )
Konstruiert ein Element direkt am Ende
(öffentliche Elementfunktion von std::vector<T,Allocator> )
entfernt das letzte Element
(öffentliche Elementfunktion von std::vector<T,Allocator> )
ändert die Anzahl der gespeicherten Elemente
(öffentliche Elementfunktion von std::vector<T,Allocator> )
tauscht die Inhalte aus
(öffentliche Elementfunktion von std::vector<T,Allocator> )
vector<bool> spezifische Modifikatoren
dreht alle Bits um
(öffentliche Elementfunktion)
[static]
tauscht zwei std::vector<bool>:: reference s
(öffentliche statische Elementfunktion)

Nicht-Member-Funktionen

(entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (entfernt in C++20) (C++20)
vergleicht zwei vector -Werte lexikographisch
(Funktionstemplate)
spezialisiert den std::swap -Algorithmus
(Funktionstemplate)
löscht alle Elemente, die bestimmte Kriterien erfüllen
(Funktionstemplate)

Hilfsklassen

Hash-Unterstützung für std :: vector < bool >
(Klassen-Template-Spezialisierung)

Deduktionsleitfäden (C++17)

Hinweise

Wenn die Größe des Bitsets zur Compile-Zeit bekannt ist, std::bitset kann verwendet werden, das einen umfangreicheren Satz an Member-Funktionen bietet. Zusätzlich existiert boost::dynamic_bitset als Alternative zu std :: vector < bool > .

Da seine Darstellung möglicherweise optimiert ist, erfüllt std :: vector < bool > nicht notwendigerweise alle Container - oder SequenceContainer -Anforderungen. Beispielsweise erfüllt std :: vector < bool > :: iterator möglicherweise nicht die LegacyForwardIterator -Anforderung, da er implementierungsdefiniert ist. Die Verwendung von Algorithmen wie std::search , die LegacyForwardIterator s erfordern, kann zu Kompilierzeit- oder Laufzeitfehlern führen .

Die Boost.Container-Version von vector spezialisiert nicht für bool .

Feature-Test Makro Wert Std Feature
__cpp_lib_containers_ranges 202202L (C++23) Ranges-Konstruktion und -Einfügung für Container

Beispiel

#include <cassert>
#include <initializer_list>
#include <iostream>
#include <vector>
void println(auto rem, const std::vector<bool>& vb)
{
    std::cout << rem << " = [";
    for (std::size_t t{}; t != vb.size(); ++t)
        std::cout << (t ? ", " : "") << vb[t];
    std::cout << "]\n";
}
int main()
{
    std::vector<bool> v1; // erstellt einen leeren Vektor von booleschen Werten
    println("1) v1", v1);
    std::vector<bool> v2{0, 1, 1, 0, 1}; // erstellt einen gefüllten Vektor
    println("2) v2", v2);
    v1 = v2; // kopiert v2 nach v1
    println("3) v1", v1);
    assert(v1.size() == v2.size()); // prüft, ob v1 und v2 gleiche Größe haben
    assert(v1.front() == false); // greift auf erstes Element zu, äquivalent zu:
    assert(v1[0] == false);
    assert(v1.back() == true); // greift auf letztes Element zu, äquivalent zu:
    assert(v1[v1.size() - 1] == true);
    v1 = {true, true, false, false}; // weist eine Initialisierungsliste zu
    println("4) v1", v1);
    v1.push_back(true); // fügt ein Element am Ende hinzu
    println("5) v1", v1);
    v1.pop_back(); // entfernt ein Element vom Ende
    println("6) v1", v1);
    v1.flip(); // invertiert alle Elemente
    println("7) v1", v1);
    v1.resize(8, true); // ändert die Größe von v1; neue Elemente werden auf "true" gesetzt
    println("8) v1", v1);
    v1.clear(); // löscht v1
    assert(v1.empty()); // prüft, ob v1 leer ist
}

Ausgabe:

1) v1 = []
2) v2 = [0, 1, 1, 0, 1]
3) v1 = [0, 1, 1, 0, 1]
4) v1 = [1, 1, 0, 0]
5) v1 = [1, 1, 0, 0, 1]
6) v1 = [1, 1, 0, 0]
7) v1 = [0, 0, 1, 1]
8) v1 = [0, 0, 1, 1, 1, 1, 1, 1]

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2187 C++11 Spezialisierungen für bool fehlten emplace und emplace_back Memberfunktionen hinzugefügt