¿ std::set
Almacena objetos en memoria contigua como std::vector
?
No he podido encontrar esto en la web, cppreference no menciona detalles sobre la asignación de memoria. Pero no puedo ver por qué no podría usar memoria contigua, de ahí mi pregunta.
set::insert
requisitos: en.cppreference.com/w/cpp/container/set/insert "... No se invalidan los iteradores ni las referencias ...", por lo que no puede reasignarse cuando necesita expandirse como lostd::vector
hace.std::set
no es una de esas cosas, que es la clave aquí.Respuestas:
No hay garantía de que lo haga. También en la práctica, no puede debido a los requisitos del contenedor. Por lo tanto, no, no almacena objetos en la memoria contigua.
Las referencias a elementos del conjunto deben seguir siendo válidas después de su inserción, así como de su borrado (a excepción de las referencias al elemento borrado). Este requisito es incompatible con la memoria contigua.
Hasta donde yo sé, un árbol de búsqueda equilibrado es la única estructura de datos que puede implementar
std::set
.fuente
insert
copiar todos los nodos en un nuevo bloque más grande para limitarlo a un solo bloque, en caso de que realloc falle en el lugar o (típico para C ++) el asignador no es compatible con tal realloc.)No se excluye explícitamente, aunque ciertas restricciones
std::set
impiden el uso de memoria contigua.Por ejemplo,
set::insert
tiene complejidad logarítmica mientras quevector::insert
requiere complejidad lineal para barajar sus entradas. Tampocoset::insert
invalida los iteradores. Ambos requisitos no pueden cumplirse con memoria distinguida.fuente