Spec-Zone.ru › C++

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

void resize( size_type count );
(1) (constexpr начиная с C++20)
void resize( size_type count, const value_type& value );
(2) (constexpr начиная с C++20)

Изменяет размер контейнера так, чтобы он содержал count элементов; ничего не делает, если count == size().

Если текущий размер больше count, контейнер сокращается до первых count элементов.

Если текущий размер меньше count, то:

1) Добавляются дополнительные элементы, вставляемые по умолчанию.
2) Добавляются дополнительные копии value.

Параметры

count - новый размер контейнера
value - значение, которым инициализируются новые элементы
Требования к типам
-T должен соответствовать требованиям MoveInsertable и DefaultInsertable для использования перегрузки (1).
-T должен соответствовать требованиям CopyInsertable для использования перегрузки (2).

Сложность

Линейная относительно разницы между текущим размером и count. Дополнительная сложность возможна из-за перераспределения памяти, если вместимость меньше count.

Исключения

Если по какой-либо причине выбрасывается исключение, эти функции не оказывают никакого эффекта (гарантия строгой безопасности исключений). Хотя это явно не указано, выбрасывается std::length_error, если вместимость, необходимая для нового vector, превышает max_size().

В перегрузке (1), если конструктор перемещения T не является noexcept, а T не является CopyInsertable в *this, vector использует конструктор перемещения, который может выбросить исключение. Если он выбрасывает исключение, гарантия не предоставляется, а эффекты не определены.

(начиная с C++11)

Примечания

Если инициализация значением в перегрузке (1) нежелательна, например, если элементы имеют несклассовый тип и обнуление не требуется, ее можно избежать, предоставив пользовательский Allocator::construct.
Вместимость vector никогда не уменьшается при изменении размера в сторону уменьшения, поскольку это сделало бы недействительными все итераторы, тогда как спецификация предусматривает инвалидирование только итераторов на удаляемые элементы и после них.

Пример

#include <vector>
#include <iostream>

void print(auto rem, const std::vector<int>& c)
{
    for (std::cout << rem; const int el : c)
        std::cout << el << ' ';
    std::cout << '\n';
}

int main()
{
    std::vector<int> c = {1, 2, 3};
    print("The vector holds: ", c);

    c.resize(5);
    print("After resize up to 5: ", c);

    c.resize(2);
    print("After resize down to 2: ", c);

    c.resize(6, 4);
    print("After resize up to 6 (initializer = 4): ", c);
}

Вывод:

The vector holds: 1 2 3
After resize up to 5: 1 2 3 0 0
After resize down to 2: 1 2
After resize up to 6 (initializer = 4): 1 2 4 4 4 4

Отчеты об ошибках

Следующие отчеты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

Отчет об ошибке Применен к Поведение согласно опубликованной версии Корректное поведение
LWG 679 C++98 resize() передавался value по значению передается по константной ссылке
LWG 1525 C++98 поведение resize(size()) не было определено определено
LWG 2033 C++11 1. элементы удалялись с помощью erase()[1]
2. требования к типу для T были некорректными
1. используется pop_back()
2. исправлено
LWG 2066 C++11 для перегрузки (1) не предоставлялась гарантия
безопасности исключений, предоставляемая перегрузкой (2)
добавлена
LWG 2160 C++11 элементы удалялись с помощью pop_back()[2]
в результате принятия решения по LWG 2033
способ удаления элементов
не указывается
  1. erase() может удалять элементы из середины vector, поэтому тип значения должен удовлетворять требованиям MoveAssignable, чтобы элементы после удаляемой части можно было переместить вперед и заполнить образовавшийся промежуток. Однако resize() может удалять элементы только из конца vector, поэтому требование MoveAssignable не нужно.
  2. Удаление элементов с помощью pop_back() подразумевает, что элементы необходимо удалять с конца к началу.

См. также

max_size
возвращает максимально возможное количество элементов
(открытая функция-член)
size
возвращает количество элементов
(открытая функция-член)
capacity
возвращает количество элементов, которые могут храниться в выделенной в данный момент памяти
(открытая функция-член)
empty
проверяет, пуст ли контейнер
(открытая функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/vector/resize

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API