std::vector<T,Allocator>::vector
vector() : vector(Allocator()) {}
|
(1) | (seit C++11) (bis C++17) |
vector() noexcept(noexcept(Allocator())) : vector(Allocator()) {}
|
(seit C++17) (constexpr seit C++20) |
|
explicit vector( const Allocator& alloc = Allocator() );
|
(2) | (bis C++11) |
explicit vector( const Allocator& alloc );
|
(seit C++11) (noexcept seit C++17) (constexpr seit C++20) |
|
explicit vector( size_type count,
const Allocator& alloc = Allocator() );
|
(3) | (seit C++11) |
explicit vector( size_type count, const T& value = T(),
const Allocator& alloc = Allocator() );
|
(4) | (bis C++11) |
vector( size_type count, const T& value,
const Allocator& alloc = Allocator() );
|
(seit C++11) (constexpr seit C++20) |
|
template< class InputIt >
vector( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
|
(5) | (constexpr seit C++20) |
template< container-compatible-range<T> R >
constexpr vector( std::from_range_t, R&& rg,
const Allocator& alloc = Allocator() );
|
(6) | (seit C++23) |
vector( const vector& other );
|
(7) | (constexpr seit C++20) |
vector( vector&& other );
|
(8) | (seit C++11) (noexcept seit C++17) (constexpr seit C++20) |
vector( const vector& other, const Allocator& alloc );
|
(9) | (seit C++11) (constexpr seit C++20) (bis C++23) |
constexpr vector( const vector& other,
const std::type_identity_t<Allocator>& alloc );
|
(seit C++23) | |
vector( vector&& other, const Allocator& alloc );
|
(10) | (seit C++11) (constexpr seit C++20) (bis C++23) |
constexpr vector( vector&& other,
const std::type_identity_t<Allocator>& alloc );
|
(seit C++23) | |
vector( std::initializer_list<T> init,
const Allocator& alloc = Allocator() );
|
(11) | (seit C++11) |
Konstruiert ein neues vector aus einer Vielzahl von Datenquellen, optional unter Verwendung eines vom Benutzer bereitgestellten Allokators alloc.
vector mit einem default-konstruierten Allokator.Allocator nicht DefaultConstructible ist, ist das Verhalten undefiniert.vector mit dem gegebenen Allokator alloc.vector mit count default-eingefügten Objekten von T. Es werden keine Kopien erstellt.vector mit count Kopien von Elementen mit Wert value.
|
Wenn |
(seit C++11) |
vector mit dem Inhalt des Bereichs [first, last). Jeder Iterator in [first, last) wird genau einmal dereferenziert.
|
Wenn |
(bis C++11) |
|
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:
|
(seit C++11) |
vector mit dem Inhalt des Bereichs rg. Jeder Iterator in rg wird genau einmal dereferenziert.Tist nicht EmplaceConstructible instd::vector<T>aus*ranges::begin(rg).Rmodelliert weder sized_range noch forward_range, undTist nicht MoveInsertable instd::vector<T>.
vector mit dem Inhalt von other.|
Der Allokator wird ermittelt, als ob |
(seit C++11) |
other.get_allocator() ermittelt.alloc als Allokator verwendet wird.alloc als Allokator verwendet wird.vector(il.begin(), il.end(), alloc).Parameter
| alloc | - | Allokator, der für alle Speicherallokationen dieses Containers verwendet wird |
| count | - | die Größe des Containers |
| value | - | der Wert, mit dem Elemente des Containers initialisiert werden |
| first, last | - | das Paar von Iteratoren, die den Bereich der Elemente definieren, aus dem die Elemente kopiert werden |
| other | - | ein anderer Container, der als Quelle zur Initialisierung der Elemente des Containers verwendet wird |
| init | - | Initialisierungsliste zur Initialisierung der Elemente des Containers |
| rg | - | ein containerkompatibler Bereich |
Komplexität
-
Wenn
InputItdie Anforderungen von LegacyForwardIterator erfüllt, dann:
-
-
Der Kopierkonstruktor von
Twird nur N -mal aufgerufen. - Keine Neuzuweisung erfolgt.
-
Der Kopierkonstruktor von
- Andernfalls:
-
-
Der Kopierkonstruktor von
Twird O(N) -mal aufgerufen. - Neuzuweisung erfolgt O(log N) -mal.
-
Der Kopierkonstruktor von
|
(bis C++26) |
|
(seit C++26) |
-
- Initialisiert exakt N Elemente aus dem Ergebnis der Dereferenzierung aufeinanderfolgender Iteratoren von rg .
- Keine Reallokation erfolgt.
- Andernfalls:
-
-
Der Kopier- oder Move-Konstruktor von
Twird O(N) Mal aufgerufen. - Reallokation erfolgt O(log N) Mal.
-
Der Kopier- oder Move-Konstruktor von
Ausnahmen
Aufrufe von Allocator :: allocate können eine Exception werfen.
Anmerkungen
Nach der Container-Verschiebungskonstruktion (Überladung (8)) bleiben Referenzen, Zeiger und Iteratoren, die ursprünglich auf Elemente in other verwiesen, gültig, verweisen aber auf Elemente, die sich jetzt in *this befinden. Der aktuelle Standard gibt diese Garantie durch die allgemeine Aussage in [container.reqmts]/67, und eine direktere Garantie wird via LWG issue 2321 in Betracht gezogen.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | Ranges-bewusste Konstruktion und Einfügung; Überladung (6) |
Beispiel
#include <iostream> #include <string> #include <vector> template<typename T> std::ostream& operator<<(std::ostream& s, const std::vector<T>& v) { s.put('{'); for (char comma[]{'\0', ' ', '\0'}; const auto& e : v) s << comma << e, comma[0] = ','; return s << "}\n"; } int main() { // C++11 Initialisierungslisten-Syntax: std::vector<std::string> words1{"the", "frogurt", "is", "also", "cursed"}; std::cout << "1: " << words1; // words2 == words1 std::vector<std::string> words2(words1.begin(), words1.end()); std::cout << "2: " << words2; // words3 == words1 std::vector<std::string> words3(words1); std::cout << "3: " << words3; // words4 ist {"Mo", "Mo", "Mo", "Mo", "Mo"} std::vector<std::string> words4(5, "Mo"); std::cout << "4: " << words4; const auto rg = {"cat", "cow", "crow"}; #ifdef __cpp_lib_containers_ranges std::vector<std::string> words5(std::from_range, rg); // Überladung (6) #else std::vector<std::string> words5(rg.begin(), rg.end()); // Überladung (5) #endif std::cout << "5: " << words5; }
Ausgabe:
1: {the, frogurt, is, also, cursed}
2: {the, frogurt, is, also, cursed}
3: {the, frogurt, is, also, cursed}
4: {Mo, Mo, Mo, Mo, Mo}
5: {cat, cow, crow}
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 134 | C++98 | Überladung ( 5 ) erlaubte bis zu 2N Kopierkonstruktoraufrufe im Input-Iterator-Fall | geändert auf O(N) Aufrufe |
| LWG 438 | C++98 |
Überladung
(
5
)
würde nur Überladung
(
4
)
aufrufen
wenn
InputIt
ein integraler Typ ist
|
ruft Überladung
(
4
)
auf wenn
InputIt
kein LegacyInputIterator ist |
| LWG 2193 | C++11 | der Standardkonstruktor war explicit | auf non-explicit geändert |
| LWG 2210 | C++11 | Überladung ( 3 ) hatte keinen Allokator-Parameter | Parameter hinzugefügt |
| N3346 | C++11 |
für Überladung
(
3
)
, die Elemente im
Container waren value-initialized |
sie sind default-inserted |
Siehe auch
|
weist dem Container Werte zu
(öffentliche Elementfunktion) |
|
|
weist dem Container Werte zu
(öffentliche Elementfunktion) |