Ответ 1
В зависимости от версии стандарта, на которую вы смотрите,
clear
определяется как эквивалент erase(begin(), end())
, или (в С++ 11):
"Уничтожает все элементы в a.
ссылки, указатели и итераторы, ссылающиеся на
элементы a и могут аннулировать
прошлый итератор. "
В любом случае не разрешено изменять способность; следующий код гарантирован безопасным стандарт:
std::vector<int> v;
for (int i = 0; i != 5; ++ i) {
v.push_back(i);
}
assert(v.capacity() >= 5);
v.clear();
assert(v.capacity() >= 5);
v.push_back(10);
v.push_back(11);
std::vector<int>::iterator i = v.begin() + 1;
v.push_back(12);
v.push_back(13);
*i = 42; // i must still be valid, because none of
// the push_back would have required an
// increase of capacity
(Причина изменения формулировки на С++ 11: комитет
не требовал MoveAssignable
для clear
, что
имели место, если бы они были определены в терминах erase
.)