26 Containers library [containers]

26.3 Sequence containers [sequences]

26.3.11 Class template vector [vector]

26.3.11.1 Class template vector overview [vector.overview]

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 ссылка на какой-либо член результирующей специализации .

26.3.11.2 vector constructors, copy, and assignment [vector.cons]

explicit vector(const Allocator&);

Effects: Создает пустойvector, используя указанный распределитель.

Complexity: Постоянный.

explicit vector(size_type n, const Allocator& = Allocator());

Effects: Создаетvector соn вставленными по умолчанию элементами с использованием указанного распределителя.

Requires:T должен бытьDefaultInsertable в*this.

Complexity: Линейный входn.

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

Effects: Создаетvector сn копиямиvalue, используя указанный распределитель.

Requires:T должен быть CopyInsertable в*this.

Complexity: Линейный входn.

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 перераспределения, если они являются просто итераторами ввода.

26.3.11.3 vector capacity [vector.capacity]

size_type capacity() const noexcept;

Returns: Общее количество элементов, которые вектор может содержать без необходимости перераспределения.

void reserve(size_type n);

Requires:T должен бытьMoveInsertable в*this.

Effects: Директива, которая информирует vector о планируемом изменении размера, чтобы он мог соответствующим образом управлять распределением хранилища. После того, какreserve(), capacity() больше или равен аргументу ,reserve если Перераспределение происходит; и равно предыдущему значению в capacity() противном случае. Перераспределение происходит в этот момент тогда и только тогда, когда текущая емкость меньше аргумента reserve(). Если исключение выбрасывается не конструктором перемещения не-CopyInsertable типа, не будет никаких эффектов.

Complexity: Он не изменяет размер последовательности и занимает самое большее линейное время в размере последовательности.

Throws: length_­error еслиn > max_­size().260

Remarks: Перераспределение делает недействительными все ссылки, указатели и итераторы, относящиеся к элементам в последовательности. Никакое перераспределение не должно происходить во время вставок, которые происходят после вызова, reserve() до того момента, когда вставка сделает размер вектора больше, чем значение capacity().

void shrink_to_fit();

Requires:T должен бытьMoveInsertable в*this.

Effects:shrink_­to_­fit является необязательным запросом для сокращения capacity() доsize(). [ Note: Запрос не является обязывающим, чтобы дать свободу для оптимизации, зависящей от реализации. ] Он не увеличивается , но может уменьшаться , вызывая перераспределение. Если исключение вызвано другим, чем конструктором перемещения объекта non- , никаких эффектов не возникает.end notecapacity()capacity()CopyInsertableT

Complexity: Линейный по размеру последовательности.

Remarks: Перераспределение делает недействительными все ссылки, указатели и итераторы, относящиеся к элементам в последовательности, а также к итератору, прошедшему конец. Если перераспределения не происходит, они остаются в силе.

void swap(vector& x) noexcept(allocator_traits<Allocator>::propagate_on_container_swap::value || allocator_traits<Allocator>::is_always_equal::value);

Effects: Обмены содержания и capacity() о *this с уx.

Complexity: Постоянное время.

void resize(size_type sz);

Effects: Еслиsz < size(), стирает последниеsize() - sz элементы из последовательности. В противном случае добавляетsz - size() в последовательность элементы, вставленные по умолчанию.

Requires:T должно быть MoveInsertable иDefaultInsertable в*this.

Remarks: Если исключение вызвано другим, чем конструктором перемещения объекта non-CopyInsertable T , никаких эффектов не возникает.

void resize(size_type sz, const T& c);

Effects: Еслиsz < size(), стирает последниеsize() - sz элементы из последовательности. В противном случае добавляет к последовательностиsz - size() копииc .

Requires:T должен быть CopyInsertable в*this.

Remarks: Если выбрано исключение, никаких эффектов нет.

reserve() использования,Allocator​::​allocate() которые могут вызвать соответствующее исключение.

26.3.11.4 vector data [vector.data]

T* data() noexcept; const T* data() const noexcept;

Returns: Указатель,[data(), data() + size()) представляющий собой допустимый диапазон. Для непустого вектораdata()==addressof(front()).

Complexity: Постоянное время.

26.3.11.5 vector modifiers [vector.modifiers]

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();

Effects: Делает недействительными итераторы и ссылки в точке стирания или после нее.

Complexity: Деструктором объектаT называется количество раз, равное количеству стертых элементов, а оператором присваиванияT вызывается количество раз, равное количеству элементов в векторе после стертых элементов.

Throws: Ничего, если оператор присваивания или оператор присваивания перемещения не генерирует исключение T.

26.3.11.6 vector specialized algorithms [vector.special]

template <class T, class Allocator> void swap(vector<T, Allocator>& x, vector<T, Allocator>& y) noexcept(noexcept(x.swap(y)));

Effects: Как будто мимоx.swap(y).