Что говорит стандарт о том, как определение четкости вектора меняет емкость?

Этот веб-сайт означает, что очистка вектора МОЖЕТ изменить емкость:

http://en.cppreference.com/w/cpp/container/vector/clear

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

Но в соответствии с @JamesKanze это неверно, и стандартные мандаты, которые ясны, не изменят емкость.

Что говорит стандарт?

Ответ 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.)