Нужно ли проверять емкость перед добавлением элемента в вектор в c ++? - PullRequest
1 голос
/ 29 апреля 2010

Я новичок в векторах c ++ STL, поэтому извините за глупые вопросы в адвенсе. :) В моей программе у меня есть вектор, который должен хранить неизвестное количество элементов. Нужно ли проверять, достиг ли вектор своего max_size, прежде чем добавлять в него новый элемент? Будет ли компилятор c ++ автоматически генерировать исключение, когда программа пытается добавить элементы в полный вектор?

Большое спасибо, Кэсси

Ответы [ 4 ]

6 голосов
/ 29 апреля 2010

Если std::vector достиг максимального размера, попытка вставить другой элемент приведет к тому, что базовый распределитель выдаст исключение std::bad_alloc.

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

4 голосов
/ 29 апреля 2010

Поскольку вы не включили пример кода, просто для ясности, это зависит от того, как вы добавляете код. Если вы используете push_back(), то да, вектор будет автоматически расширяться. Если вы что-то вроде v[count++]=value;, то вы можете столкнуться с проблемой, так как это не проверяет, что индекс находится в диапазоне.

1 голос
/ 29 апреля 2010

Нет. Вставка элемента просто может сделать недействительными любые итераторы, ссылки или указатели на элементы в vector. Ваша вставка будет (почти) всегда успешной.

Я говорю «почти», потому что исключение может возникнуть либо в том случае, если недостаточно памяти для перемещения базового массива (поскольку он достиг max_size - обычно в миллионах или миллиардах), либо в случае возникновения исключения при создании нового элемента , В этих случаях выдается исключение c ++.

0 голосов
/ 29 апреля 2010

Нет, тебе не о чем беспокоиться. Векторы и другие контейнеры STL автоматически растут по мере необходимости (в отличие от обычных массивов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...