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 выбрасывается, если требуемая вместимость нового вектора превысит max_size().

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

Шаблон:mark since 11

Примечания

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

Пример

#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++.

DR Применяется к Поведение, как опубликовано Корректное поведение
LWG 679 C++98 resize() передавался value по значению передается по константной ссылке
LWG 1525 C++98 поведение resize(size()) не было определено определено
LWG 2033 C++11 1. элементы удалялись с использованием erase()
2. требования к типу T были некорректны
1. используется pop_back()
2. исправлено
LWG 2066 C++11 перегрузка (1) не имела гарантии устойчивости к исключениям, как перегрузка (2) добавлен

См. также

size
возвращает количество элементов
(public member function)
insert
вставляет элементы
(public member function)
erase
удаляет элементы
(public member function)

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

Spec-Zone.ru

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