C++/vector/methods/resize

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

std::vector::resize — общедоступная функция-член шаблонного класса контейнера std::vector, что изменяет размер контейнера, чтобы он содержал указанное кол-во элементов.

Внимание! Метод работает только в случае, когда контейнеру уже был задан какой-либо размер, т.е., если размер не был задан, метод не работает, т.к. он лишь изменяет имеющийся размер, а не задаёт его. Размер должен быть отличным от нуля.

Синтаксис

C++98:

void resize(size_type n, value_type val = value_type());

C++11:

void resize(size_type n);
void resize(size_type n, const value_type& val);

Параметры

  • n — новый размер контейнера, выраженный в количестве элементов. Тип элемента size_type — целочисленный беззнаковый тип.
  • val — объект, содержимое которого копируется в добавленные элементы, если n больше текущего размера контейнера.
    Если не указан, вместо него используется конструктор по-умолчанию.
    Тип элемента value_type — тип элементов в контейнере, определенный в векторе как псевдоним первого параметра шаблона (T).

Изменение размера

Если n меньше текущего размера контейнера, содержимое сокращается до первых n элементов, удаляя все остальные (и уничтожая их).

Если n больше текущего размера контейнера, содержимое расширяется, вставляя в конце столько элементов, сколько необходимо для достижения размера n. Если указан val, новые элементы инициализируются как копии val, в противном случае они инициализируются значением.

Если n также больше текущей ёмкости контейнера, происходит автоматическое перераспределение выделенного пространства для хранения.

Обратите внимание, что эта функция изменяет фактическое содержимое контейнера, вставляя или удаляя из него элементы.

Возвращаемое значение

  • void - если происходит перераспределение, хранилище выделяется с помощью распределителя контейнера, который может вызывать исключения в случае сбоя (для распределителя по-умолчанию, bad_alloc выбрасывается, если запрос выделения не выполняется).

Примеры

Изменение размера вектора:

#include <iostream>
#include <vector>

int main () {
	std::vector<int> myvector;

	// set some initial content:
	for (int i = 1; i < 10; i++)
		myvector.push_back(i);

	myvector.resize(5);
	myvector.resize(8, 100);
	myvector.resize(12);

	std::cout << "myvector contains:";
	for (int i = 0; i < myvector.size(); i++)
		std::cout << ' ' << myvector[i];
	std::cout << '\n';

	return 0;
}

Вывод:

myvector contains: 1 2 3 4 5 100 100 100 0 0 0 0

Сложность

Линейная по количеству вставленных/удаленных элементов.

Срок действия итератора

В случае сжатия контейнера все итераторы, указатели и ссылки на элементы, которые не были удалены, остаются действительными после изменения размера и относятся к тем же элементам, на которые они ссылались до вызова.

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

Гонки данных

Если происходит перераспределение, изменяются все содержащиеся элементы. В противном случае ни один из элементов до n не будет доступен, и одновременный доступ к ним или их изменение безопасны.

Исключительная безопасность

Если n меньше или равно размеру контейнера, функция никогда не генерирует исключения (гарантия отсутствия исключения).

Если n больше и происходит перераспределение, то нет изменений в контейнере в случае исключения (строгая гарантия), если тип элементов либо копируемый, либо перемещаемый без выброса. В противном случае, если генерируется исключение, контейнер остается с допустимым состоянием (базовая гарантия).

См. также