Warum sind std::set/std::map in unterschiedlichen Headern?
-
Warum gibt es zwei Headers
<set>und<map>wenn beide quasi das gleiche tun? std::set ist eine std::map mit einer leeren Value, beide sind nur ein schlankes Interface um einen gemeinsamen Red-Black-Tree. Man spart sich also nichts an Compilezeit, wenn man nur eines von beiden included.Gleiches mit
<unordered_set>und<unordered_map>.Umgekehrt mit
<queue>:std::priority_queueundstd::queuesind zwei völlig verschiedene Container und trotzdem im gleichen Headern.std::priority_queuemuss den ganzen Heap-Algorithmus implementieren (setzt default-mässig aufstd::vectorauf),std::queueist nur ein dummer Wrapper um einen Container (default-mässig aufstd::deque).Steckt dahinter ein Sinn oder ist das nur mit "historisch gewachsen" zu erklären?
-
Na,
weil es ist so ist und im Standard steht.
Deswegen ist es so. Weil es im Standard steht.
Weil es so ist und im Standard steht.
-
Erstmal: Ich würde eher eine Map mithilfe eines Sets implementieren, quasi als Typ ein std::pair mit Key und Value als Typen, wo aber nur nach Key sortiert wird.
Aber im Prinzip hab ich mich das gleiche auch schonmal gefragt...

-
Nicht zu vergessen die std::multimap (und std::multiset! ... und std::unordered_multimap!! ... und std::unordered_multiset!!!) die zu 100% jeder braucht, der einen der entsprechenden Header included!
-
Das hat weniger mit Kompilierzeit zu tun als mit logischer Gliederung. Set und Map sind verschiedene Konzepte, wie sie implementiert sind ist egal. Zumal das vom Standard nicht vorgeschrieben wird.
Ich finde gut dass hier getrennt wird, könnte man auch ruhig an ein paar anderen Orten machen. <functional> und <memory> sind z.B. ziemlich überladen.