std::vector<T,Allocator>::vector

Constructs a new vector from a variety of data sources, optionally using a user supplied allocator alloc.

# Declarations

vector() : vector(Allocator()) {}

(since C++11) (until C++17)

vector() noexcept(noexcept(Allocator())) : vector(Allocator()) {}

(since C++17) (constexpr since C++20)

explicit vector( const Allocator& alloc = Allocator() );

(until C++11)

explicit vector( const Allocator& alloc );

(since C++11) (noexcept since C++17) (constexpr since C++20)

explicit vector( size_type count,
const Allocator& alloc = Allocator() );

(since C++11)

explicit vector( size_type count, const T& value = T(),
const Allocator& alloc = Allocator() );

(until C++11)

vector( size_type count, const T& value,
const Allocator& alloc = Allocator() );

(since C++11) (constexpr since C++20)

template< class InputIt >
vector( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );

(constexpr since C++20)

template< container-compatible-range<T> R >
constexpr vector( std::from_range_t, R&& rg,
const Allocator& alloc = Allocator() );

(since C++23)

vector( const vector& other );

(constexpr since C++20)

vector( vector&& other );

(since C++11) (noexcept since C++17) (constexpr since C++20)

vector( const vector& other, const Allocator& alloc );

(since C++11) (constexpr since C++20) (until C++23)

constexpr vector( const vector& other,
const std::type_identity_t<Allocator>& alloc );

(since C++23)

vector( vector&& other, const Allocator& alloc );

(since C++11) (until C++23)

constexpr vector( vector&& other,
const std::type_identity_t<Allocator>& alloc );

(since C++23)

vector( std::initializer_list<T> init,
const Allocator& alloc = Allocator() );

(since C++11)

# Parameters

# Notes

After container move construction (overload (8)), references, pointers, and iterators (other than the end iterator) to other remain valid, but refer to elements that are now in *this. The current standard makes this guarantee via the blanket statement in [container.reqmts]/67, and a more direct guarantee is under consideration via LWG issue 2321.

# Example

#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 initializer list 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 is {"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); // overload (6)
#else
    std::vector<std::string> words5(rg.begin(), rg.end()); // overload (5)
#endif
    std::cout << "5: " << words5;
}

# Defect reports

DRApplied toBehavior as publishedCorrect behavior
LWG 134C++98overload (5) allowed up to 2N  copyconstructor calls in the input iterator casechanged to O(N) calls
LWG 438C++98overload (5) would only call overload (4)if InputIt is an integral typecalls overload (4) if InputItis not an LegacyInputIterator
LWG 2193C++11the default constructor was explicitmade non-explicit
LWG 2210C++11overload (3) did not have an allocator parameteradded the parameter
N3346C++11for overload (3), the elements inthe container were value-initializedthey are default-inserted

# See also