A vector - это контейнер последовательности, который поддерживает (амортизированные) операции вставки и стирания с постоянным временем в конце; вставка и стирание в середине занимают линейное время. Управление хранилищем осуществляется автоматически, хотя могут быть даны подсказки для повышения эффективности.
Avector удовлетворяет все требования , предъявляемые к container и от в reversible контейнере, из контейнера последовательности, в том числе большинства из optional sequence container requirements, с концентрацией allocator-aware container, а для типа элемента , отличногоbool, в Аcontiguous container. Исключением являются функции-члены push_front,pop_frontиemplace_front , которые не предусмотрены. Здесь описаны только операцииvector , не описанные в одной из этих таблиц, или операции, в которых есть дополнительная семантическая информация.
namespace std { template <class T, class Allocator = allocator<T>> class vector { public: // types: using value_type = T; using allocator_type = Allocator; using pointer = typename allocator_traits<Allocator>::pointer; using const_pointer = typename allocator_traits<Allocator>::const_pointer; using reference = value_type&; using const_reference = const value_type&; using size_type = implementation-defined; // see [container.requirements] using difference_type = implementation-defined; // see [container.requirements] using iterator = implementation-defined; // see [container.requirements] using const_iterator = implementation-defined; // see [container.requirements] using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>; // [vector.cons], construct/copy/destroy vector() noexcept(noexcept(Allocator())) : vector(Allocator()) { } explicit vector(const Allocator&) noexcept; explicit vector(size_type n, const Allocator& = Allocator()); vector(size_type n, const T& value, const Allocator& = Allocator()); template <class InputIterator> vector(InputIterator first, InputIterator last, const Allocator& = Allocator()); vector(const vector& x); vector(vector&&) noexcept; vector(const vector&, const Allocator&); vector(vector&&, const Allocator&); vector(initializer_list<T>, const Allocator& = Allocator()); ~vector(); vector& operator=(const vector& x); vector& operator=(vector&& x) noexcept(allocator_traits<Allocator>::propagate_on_container_move_assignment::value || allocator_traits<Allocator>::is_always_equal::value); vector& operator=(initializer_list<T>); template <class InputIterator> void assign(InputIterator first, InputIterator last); void assign(size_type n, const T& u); void assign(initializer_list<T>); allocator_type get_allocator() const noexcept; // iterators: iterator begin() noexcept; const_iterator begin() const noexcept; iterator end() noexcept; const_iterator end() const noexcept; reverse_iterator rbegin() noexcept; const_reverse_iterator rbegin() const noexcept; reverse_iterator rend() noexcept; const_reverse_iterator rend() const noexcept; const_iterator cbegin() const noexcept; const_iterator cend() const noexcept; const_reverse_iterator crbegin() const noexcept; const_reverse_iterator crend() const noexcept; // [vector.capacity], capacity bool empty() const noexcept; size_type size() const noexcept; size_type max_size() const noexcept; size_type capacity() const noexcept; void resize(size_type sz); void resize(size_type sz, const T& c); void reserve(size_type n); void shrink_to_fit(); // element access: reference operator[](size_type n); const_reference operator[](size_type n) const; const_reference at(size_type n) const; reference at(size_type n); reference front(); const_reference front() const; reference back(); const_reference back() const; // [vector.data], data access T* data() noexcept; const T* data() const noexcept; // [vector.modifiers], modifiers template <class... Args> reference emplace_back(Args&&... args); void push_back(const T& x); void push_back(T&& x); void pop_back(); template <class... Args> iterator emplace(const_iterator position, Args&&... args); iterator insert(const_iterator position, const T& x); iterator insert(const_iterator position, T&& x); iterator insert(const_iterator position, size_type n, const T& x); template <class InputIterator> iterator insert(const_iterator position, InputIterator first, InputIterator last); iterator insert(const_iterator position, initializer_list<T> il); iterator erase(const_iterator position); iterator erase(const_iterator first, const_iterator last); void swap(vector&) noexcept(allocator_traits<Allocator>::propagate_on_container_swap::value || allocator_traits<Allocator>::is_always_equal::value); void clear() noexcept; }; template<class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>> vector(InputIterator, InputIterator, Allocator = Allocator()) -> vector<typename iterator_traits<InputIterator>::value_type, Allocator>; template <class T, class Allocator> bool operator==(const vector<T, Allocator>& x, const vector<T, Allocator>& y); template <class T, class Allocator> bool operator< (const vector<T, Allocator>& x, const vector<T, Allocator>& y); template <class T, class Allocator> bool operator!=(const vector<T, Allocator>& x, const vector<T, Allocator>& y); template <class T, class Allocator> bool operator> (const vector<T, Allocator>& x, const vector<T, Allocator>& y); template <class T, class Allocator> bool operator>=(const vector<T, Allocator>& x, const vector<T, Allocator>& y); template <class T, class Allocator> bool operator<=(const vector<T, Allocator>& x, const vector<T, Allocator>& y); // [vector.special], specialized algorithms template <class T, class Allocator> void swap(vector<T, Allocator>& x, vector<T, Allocator>& y) noexcept(noexcept(x.swap(y))); }
Неполный типT может использоваться приvector создании экземпляра, если распределитель удовлетворяет требованиям allocator completeness requirements. T заполняется до того, как будет сделанаvector ссылка на какой-либо член результирующей специализации .
explicit vector(const Allocator&);
explicit vector(size_type n, const Allocator& = Allocator());
Effects: Создаетvector соn вставленными по умолчанию элементами с использованием указанного распределителя.
vector(size_type n, const T& value,
const Allocator& = Allocator());
template <class InputIterator>
vector(InputIterator first, InputIterator last,
const Allocator& = Allocator());
Effects: Создает значение,vector равное диапазону[first, last), используя указанный распределитель.
Complexity: Выполняет толькоN вызовы конструктора копирования T (гдеN - расстояние между first и last) и не выполняет перераспределения, если итераторыfirst иlast относятся к категориям прямого, двунаправленного или произвольного доступа. Он выполняет упорядоченные N вызовы конструктора копирования T и упорядочивает logN перераспределения, если они являются просто итераторами ввода.
size_type capacity() const noexcept;
Returns: Общее количество элементов, которые вектор может содержать без необходимости перераспределения.
void reserve(size_type n);
Effects: Директива, которая информирует vector о планируемом изменении размера, чтобы он мог соответствующим образом управлять распределением хранилища. После того, какreserve(), capacity() больше или равен аргументу ,reserve если Перераспределение происходит; и равно предыдущему значению в capacity() противном случае. Перераспределение происходит в этот момент тогда и только тогда, когда текущая емкость меньше аргумента reserve(). Если исключение выбрасывается не конструктором перемещения не-CopyInsertable типа, не будет никаких эффектов.
Complexity: Он не изменяет размер последовательности и занимает самое большее линейное время в размере последовательности.
Remarks: Перераспределение делает недействительными все ссылки, указатели и итераторы, относящиеся к элементам в последовательности. Никакое перераспределение не должно происходить во время вставок, которые происходят после вызова, reserve() до того момента, когда вставка сделает размер вектора больше, чем значение capacity().
void shrink_to_fit();
Effects:shrink_to_fit является необязательным запросом для сокращения capacity() доsize(). [ Note: Запрос не является обязывающим, чтобы дать свободу для оптимизации, зависящей от реализации. ] Он не увеличивается , но может уменьшаться , вызывая перераспределение. Если исключение вызвано другим, чем конструктором перемещения объекта non- , никаких эффектов не возникает. — end note capacity()capacity()CopyInsertableT
Remarks: Перераспределение делает недействительными все ссылки, указатели и итераторы, относящиеся к элементам в последовательности, а также к итератору, прошедшему конец. Если перераспределения не происходит, они остаются в силе.
void swap(vector& x)
noexcept(allocator_traits<Allocator>::propagate_on_container_swap::value ||
allocator_traits<Allocator>::is_always_equal::value);
void resize(size_type sz);
Effects: Еслиsz < size(), стирает последниеsize() - sz элементы из последовательности. В противном случае добавляетsz - size() в последовательность элементы, вставленные по умолчанию.
Remarks: Если исключение вызвано другим, чем конструктором перемещения объекта non-CopyInsertable T , никаких эффектов не возникает.
void resize(size_type sz, const T& c);
Effects: Еслиsz < size(), стирает последниеsize() - sz элементы из последовательности. В противном случае добавляет к последовательностиsz - size() копииc .
reserve() использования,Allocator::allocate() которые могут вызвать соответствующее исключение.
T* data() noexcept;
const T* data() const noexcept;
Returns: Указатель,[data(), data() + size()) представляющий собой допустимый диапазон. Для непустого вектораdata()==addressof(front()).
iterator insert(const_iterator position, const T& x);
iterator insert(const_iterator position, T&& x);
iterator insert(const_iterator position, size_type n, const T& x);
template <class InputIterator>
iterator insert(const_iterator position, InputIterator first, InputIterator last);
iterator insert(const_iterator position, initializer_list<T>);
template <class... Args> reference emplace_back(Args&&... args);
template <class... Args> iterator emplace(const_iterator position, Args&&... args);
void push_back(const T& x);
void push_back(T&& x);
Remarks: Вызывает перераспределение, если новый размер больше старого. Перераспределение делает недействительными все ссылки, указатели и итераторы, относящиеся к элементам в последовательности. Если перераспределения не происходит, все итераторы и ссылки до точки вставки остаются действительными. Если исключение создается не конструктором копирования, конструктором перемещения, оператором присваивания или оператором присваивания перемещения T или какой-либоInputIterator операцией, эффекты отсутствуют. Если при вставке одного элемента в конце возникает исключение, которое T естьCopyInsertable илиis_nothrow_move_constructible_v<T> естьtrue, никаких эффектов нет. В противном случае, если конструктор перемещения не-CopyInsertable T, генерирует исключение , эффекты не определены.
Complexity: Сложность линейна по количеству вставленных элементов плюс расстояние до конца вектора.
iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last);
void pop_back();
Complexity: Деструктором объектаT называется количество раз, равное количеству стертых элементов, а оператором присваиванияT вызывается количество раз, равное количеству элементов в векторе после стертых элементов.
template <class T, class Allocator>
void swap(vector<T, Allocator>& x, vector<T, Allocator>& y)
noexcept(noexcept(x.swap(y)));