Является ли временная сложность ' std:: vector: clear` *действительно* не указана?

во время работы этот вопрос, выяснилось, что, по-видимому, нет требований к сложности времени, установленных на std::vector<T>::clear по стандарту C++.

таблица 100 под 23.2.3 гласит:

уничтожает все элементы a. Аннулирует все ссылки, указатели и итераторы, относящиеся к элементам a и может сделать недействительным итератор past-the-end. сообщение: a.empty() возвращает true

и... вот и все. Там нет конкретно под 23.3.6, а не явно указание на то, что к clear:

[C++11: 23.3.6.1/1]: вектор-это контейнер последовательности, которая поддерживает итераторы произвольного доступа. Кроме того, он поддерживает (амортизированные) операции вставки и стирания постоянного времени в конце; вставка и стирание в середине занимают линейное время. Управление хранилищем обрабатывается автоматически, хотя могут быть даны подсказки для улучшения эффективность. [..]

так... это правда? Или я просто пропустил это?

1 ответов


это кажется непреднамеренным следствием д-р 704 (и связанные с ними DR 1301), который удалил формулировку, говорящую clear() эквивалентно erase(begin(), end()), потому что erase() требуется MoveAssignable, который не требуется при удалении каждого элемента. Удаление определения в терминах erase() также удаляет требование сложности. Это, вероятно, можно сделать редакционно; я поднял это с комитетом.

Б. Н.std::deque::clear() и std::forward_list::clear() также пострадавших. std::list::clear() имеет гарантию сложности.

Edit: это сейчас http://cplusplus.github.com/LWG/lwg-active.html#2231