Est-ce que std::set
stocker des objets dans une mémoire contiguë comme std::vector
?
Je n'ai pas pu trouver cela sur le web, cppreference ne mentionne pas de détails sur l'allocation de mémoire. Mais je ne vois pas pourquoi il ne pouvait pas utiliser de mémoire contiguë, d'où ma question.
set::insert
exigences: en.cppreference.com/w/cpp/container/set/insert "... Aucun itérateur ou référence n'est invalidé ...." donc il ne peut pas se réallouer quand il a besoin de se développer comme il lestd::vector
fait.std::set
n'est pas une de ces choses, qui est la clé ici.Réponses:
Il n'y a aucune garantie que ce soit le cas. En pratique également, cela ne peut pas en raison des exigences du conteneur. Par conséquent non, il ne stocke pas d'objets dans la mémoire contiguë.
Les références aux éléments de l'ensemble doivent rester valides lors de leur insertion ainsi que de leur effacement (sauf pour les références à l'élément effacé). Cette exigence est incompatible avec la mémoire contiguë.
Pour autant que je sache, un arbre de recherche équilibré est la seule structure de données qui peut être implémentée
std::set
.la source
insert
copier tous les nœuds dans un nouveau bloc plus grand pour le limiter à un seul bloc, au cas où le réallocation sur place échouerait ou (typique pour C ++) l'allocateur ne prend pas en charge un tel réallocation.)Il n'est pas exclu explicitement, bien que certaines contraintes
std::set
rendent impossible l'utilisation de la mémoire contiguë.Par exemple,
set::insert
a une complexité logarithmique tout envector::insert
nécessitant une complexité linéaire pour mélanger ses entrées. N'invalideset::insert
pas non plus les itérateurs. Les deux exigences ne peuvent pas être réalisées avec une mémoire contingente.la source