Является ли временная сложность ' 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