Después de investigar con expertos en esta materia, programadores de deferentes ramas y profesores hemos dado con la respuesta al dilema y la compartimos en esta publicación.
Solución:
Según el estándar C++, la iteración sobre los elementos en un std::set
procede en orden ordenado según lo determinado por std::less
o por el argumento de plantilla de predicado de comparación opcional.
(También según el estándar C ++, la inserción, la búsqueda y la eliminación toman como máximo O (lg norte) tiempo, por lo que los árboles de búsqueda equilibrados son actualmente la única opción de implementación viable para std::set
aunque el estándar no exige el uso de árboles rojo-negro).
Significa que internamente std::set
almacenará sus elementos como un árbol ordenado. Sin embargo, la especificación no dice nada sobre el orden de clasificación. Por defecto, std::set
usos std::less
y así se ordenará de menor a mayor. Sin embargo, puede hacer que la función de clasificación sea lo que quiera, usando este parámetro de plantilla:
std::set myCustomOrderedSet;
Así por ejemplo:
std::set > myInverseSortedSet;
o
struct cmpStruct
bool operator() (int const & lhs, int const & rhs) const
return lhs > rhs;
;
std::set myInverseSortedSet;
De hecho, estos ejemplos también se proporcionan en el sitio web que vinculó. Más específicamente aquí: constructor de conjuntos.
por especificación, el orden de iteración del conjunto siempre es ascendente
Sí, los valores de set siempre son ascendentes si los imprime en secuencia. Como dice la descripción, generalmente se implementa usando Red-Black Tree (RBT), pero los escritores del compilador tienen la opción de violar esto, pero generalmente se apegarían al tema de RBT ya que cualquier otra implementación no será eficiente en recursos para lograr la tarea de set
.