No, std::map
doesn't store data as pairs, it just exposes it as pairs. Although it's not forbidden to use std::pair
in underlying storage.
In typical red-black tree implementation you need at least two pointers to children nodes on top of key and value stored (and probably a pointer to parent node, I don't really remember how RB tree worked, sorry). The underlying storage type is std::map::node_type
(added since C++17), which is unspecified in standard (a.k.a. implementation specific).
Note that there is this clause (from cppreference):
For all map containers (std::map, std::multimap, std::unordered_map, and std::unordered_multimap) whose key_type is K and mapped_type is T, the behavior of operations involving node handles are undefined if a user-defined specialization of std::pair exists for std::pair<K, T>
or std::pair<const K, T>
.
It suggests that storing data in node-handle type as std::pair
is definitely allowed by standard (and implementation may assume that std::pair
behaves exactly as expected).