«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Является ли `std::list::size()` действительно O(1) в современных реализациях C++?

Является ли `std::list::size()` действительно O(1) в современных реализациях C++?

Опубликовано 17 ноября 2024 г.
Просматривать:189

Is `std::list::size()` Truly O(1) in Modern C   Implementations?

Является ли std::list::size() действительно O(n) в современных реализациях?

Недавно некоторые разработчики предположили, что std::list::size() имеет линейную временную сложность (O(n)). Однако согласно стандарту C сложность не определена и может варьироваться в зависимости от реализации.

В более ранних версиях стандарта C (C 03) операции size() рекомендовалось иметь постоянную сложность. (О(1)). Однако с появлением C 11 он стал обязательным для всех стандартных контейнеров. В таблице 96 стандарта C 11 явно указано, что .size() должна иметь постоянную сложность для всех контейнеров.

Исторически библиотека libstdc GCC реализовала size() со сложностью O(n), используя std::distance(begin (), end()), как описано в цитируемой вами записи блога. Однако в режиме C 11 это поведение изменилось:

size_type
size() const _GLIBCXX_NOEXCEPT
{ return __size_alloc_.first(); }

_LIBCPP_INLINE_VISIBILITY
const size_type& __sz() const _NOEXCEPT
    {return __size_alloc_.first();}

В GCC 5.0 и выше функция size() использует внутреннюю структуру данных для отслеживания количества элементов, эффективно выполняя операцию O(1). Это соответствует требованиям C 11 для всех стандартных контейнеров.

Важно отметить, что некоторые нишевые варианты использования все еще могут приводить к сложности O(n) для size(), но для подавляющего большинства пользователей операция должна быть постоянной по времени.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3