Namespaces
Variants

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

From cppreference.net

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

Изменяет размер контейнера для хранения count элементов:

  • Если count равен текущему размеру, ничего не делает.
  • Если текущий размер больше count , контейнер сокращается до первых count элементов.
  • Если текущий размер меньше count , тогда:
1) Дополнительные копии T ( ) (до C++11) элементы, вставленные по умолчанию (начиная с C++11) добавляются.
2) Дополнительные копии value добавляются.

Содержание

Параметры

count - новый размер контейнера
value - значение для инициализации новых элементов
Требования к типу
-

Если выполняется следующее условие, поведение не определено:

1) T не является DefaultInsertable или MoveInsertable в deque .
2) T не является CopyInsertable в deque .
(since C++11)

Сложность

Линейно по разнице между текущим размером и count .

Примечания

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

Пример

#include <deque>
#include <iostream>
void print(auto rem, const std::deque<int>& c)
{
    for (std::cout << rem; const int el : c)
        std::cout << el << ' ';
    std::cout << '\n';
}
int main()
{
    std::deque<int> c = {1, 2, 3};
    print("The deque 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 deque 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 Applied to Behavior as published Correct behavior
LWG 679 C++98 resize() передавал value по значению передаёт по константной ссылке
LWG 1418 C++98 поведение resize ( size ( ) ) не было определено определено
LWG 2033 C++11 1. элементы удалялись с использованием erase() [1]
2. T не требовалось быть MoveInsertable
1. использует pop_back()
2. требуется
LWG 2066 C++11 перегрузка ( 1 ) не имела гарантии безопасности
исключений перегрузки ( 2 )
добавлена
LWG 2160 C++11 элементы удалялись с использованием pop_back() [2]
из-за решения LWG 2033
не определяет метод
удаления элементов
  1. erase() может удалять элементы в середине deque , поэтому тип значения должен быть MoveAssignable , чтобы последующие элементы могли быть перемещены вперед для заполнения пробела. Однако, resize() может удалять элементы только в конце deque , что делает требование MoveAssignable избыточным.
  2. Удаление элементов с помощью pop_back() подразумевает, что элементы должны удаляться с конца к началу.

Смотрите также

возвращает максимально возможное количество элементов
(public member function)
возвращает количество элементов
(public member function)
проверяет, является ли контейнер пустым
(public member function)