C++ выполняет begin / end / rbegin / rend в постоянное время для std :: set, std :: map и т. д.?

Для таких типов данных, как std :: set и std :: map, где поиск выполняется за логарифмическое время, требуется ли реализация для поддержки начального и конечного итераторов? Подразумевает ли доступ begin и end поиск, который может происходить за логарифмическое время?

Я всегда предполагал, что начало и конец всегда происходят в постоянное время, однако я не могу найти этому подтверждения в Йосуттисе. Теперь, когда я работаю над чем-то, в чем мне нужно серьезно относиться к производительности, я хочу убедиться, что охватил свои основы.

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
2 570
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Да, согласно http://www.cplusplus.com/reference/stl/, begin (), end () и т. д. - все O (1).

В стандарте C++ таблица 65 в 23.1 (Требования к контейнерам) перечисляет begin () и end () как требующие постоянного времени. Если ваша реализация нарушает это, значит, она не соответствует.

Просто посмотрите на код, здесь вы можете увидеть итераторы в std :: map в GNU libstdC++

std::map

вы увидите, что все end rend cend ... все реализуются в постоянное время.

Для std :: set

начало: константа, конец: константа, rbegin: константа, rend: постоянный,

Для std :: map

они также постоянны (все они)

если есть сомнения, просто проверьте www.cplusplus.com

Не полагайтесь слишком на cplusplus.com

Jagannath 11.06.2012 18:50
Ответ принят как подходящий

Они происходят в постоянное время. Я смотрю страницу 466 стандарта ISO / IEC 14882: 2003:

Таблица 65 - Требования к контейнерам

a.begin (); (постоянная сложность)

a.end (); (постоянная сложность)

Таблица 66 - Требования к двусторонним контейнерам

a.rbegin (); (постоянная сложность)

a.rend (); (постоянная сложность)

Однако будьте осторожны с hash_map. begin () не является постоянным.

Другие вопросы по теме