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