¿ std::setAlmacena 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::insertrequisitos: 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::vectorhace.std::setno 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
insertcopiar 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::setimpiden el uso de memoria contigua.Por ejemplo,
set::inserttiene complejidad logarítmica mientras quevector::insertrequiere complejidad lineal para barajar sus entradas. Tampocoset::insertinvalida los iteradores. Ambos requisitos no pueden cumplirse con memoria distinguida.fuente