2014-12-18 2 views
2

Хорошо, так вот сделка: у меня есть вектор размера 0, который будет заполнен указателями (с вектором :: push_back), и в какой-то момент в моей программе мне нужно освободить элементы вектора и очистить вектор сам.Что произойдет, если я вызову метод на итераторе, указывающий на пустой элемент вектора?

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

Будет ли неопределенное поведение, если нет, что произойдет?

+0

Существующие итераторы будут признаны недействительными 'clear()'. Но если вы создадите новый итератор после вызова 'clear()', а затем нажав новые элементы в вектор, новый итератор будет работать нормально. * Емкость * вектора может оставаться зарезервированной, но это не влияет на * размер * –

ответ

3

Из документации для std::vector::clear (http://www.cplusplus.com/reference/vector/vector/clear/):

Итератор валидность

Все итераторы, указатели и ссылки, связанные с этим контейнером аннулируются.

Вы найдете, что данный сайт документации содержит примечания (под названием «Итераторская действительность») о том, как операции контейнера влияют на действительность итераторов, указывающих на элементы в контейнере.

+0

Хорошо, так что я должен просто сжимать вектор с помощью своп-трюка? –

+0

'std :: vector :: clear' уменьшит размер вектора до 0. Вам не нужно беспокоиться о доступе к« пустым »элементам, но не пытайтесь использовать итераторы для элементов' std :: vector', которые существовал до вызова 'std :: vector :: clear'. – sdzivanovich

+0

Отлично, это именно то, что мне нужно было знать. Я был обеспокоен тем, что столкнулся с проблемой при попытке итерации через очищенный вектор с новыми итераторами. –

0

Кажется, вы смешиваете size и capacity. Когда вы добавляете элементы в вектор, вы увеличиваете векторный размер, и если размер превышает емкость, базовый буфер будет расти, чтобы получить достаточную емкость.

Теперь, когда у вас clear вектор, размер вектора уменьшается до 0. Емкость не обязательно снижается, но обычно вам все равно, как важно для ваших алгоритмов размер. Vector end и очевидно size() определяются размером, а не суммой.

Наконец, если вы хотите вернуть емкость к размеру при удалении элементов, поскольку C++ 11 есть shrink_to_fit().

+0

Действительно, я смешивал их.Я был не уверен, могу ли я потенциально перебирать мусор в очищенном векторе. –

+0

Пока вы заканчиваете свою итерацию 'it! = End()' или 'i

0

Использование итератора, который был недействителен, вызывает неопределенное поведение.

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

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

Смежные вопросы