Spec-Zone.ru › C++

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

void resize( size_type count );
(1)
void resize( size_type count, const value_type& value );
(2)

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

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

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

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

Параметры

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

Сложность

Линейная относительно разницы между текущим размером и 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 Применено к Опубликованное поведение Правильное поведение
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() подразумевает, что элементы необходимо удалять с конца к началу.

См. также

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

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

Spec-Zone.ru

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