C++ hace begin/end/rbegin/rend ejecutar en tiempo constante para std::set, std::map, etc?
Pregunta
Para los tipos de datos, tales como std::set y std::map donde la búsqueda se produce en tiempo logarítmico, es la aplicación necesaria para mantener el comienzo y el final de los iteradores?El acceso a comenzar y terminar implica una búsqueda que podría ocurrir en un tiempo logarítmico?
Yo siempre he asumido que comienzan y terminan siempre ocurren en tiempo constante, sin embargo no puedo encontrar ninguna confirmación de esto en Josuttis.Ahora que estoy trabajando en algo que me falta para ser anal sobre el rendimiento, la quiero para asegurarse de cubrir mis bases.
Gracias
Solución
Que suceden en tiempo constante.Estoy buscando en la página 466 de la ISO/IEC 14882:2003 estándar:
Tabla 65 - Contenedor Requiments
una.begin(); (constante de la complejidad)
una.end(); (constante de la complejidad)
Tabla 66 - Reversible Requisitos De Contenedor
una.rbegin(); (constante de la complejidad)
una.rend(); (constante de la complejidad)
Otros consejos
Sí, de acuerdo a http://www.cplusplus.com/reference/stl/, begin(), end (), etc son todos los O(1).
En el estándar de C++, Tabla 65 en 23.1 (Requisitos de Contenedor) listas de begin() y end() requiere de tiempo constante.Si su aplicación viola esto, no es conforme.
Acabo de mirar el código, aquí puedes ver los iteradores en el std::map en el GNU libstdc++
verás que todos los finales de rend fin ...se realizan en tiempo constante.
Tenga cuidado con hash_map aunque.begin() no es constante.
Para std::set
comenzar:constante, al final:constante, rbegin:constante, rend:constante,
Para std::map
también son constantes (todos ellos)
si tienes alguna duda, consulta www.cplusplus.com