STL C++中的内存分配

dan*_*nce 5 c++ memory containers stl

我对STL C++中的内存重新分配感到有些困惑.例如,我知道如果我声明一个vector,并继续推回元素,向量将在某个时候需要重新分配内存空间并将所有现有元素复制到其中.对于链表,不需要重新分配,因为元素不是连续存储在堆栈中,每个元素都使用指针指向下一个元素.

我的问题是,C++中其他STL的情况如何?例如string,map,unordered_map?他们需要重新分配吗?

Mat*_*lia 10

(免责声明:此处指定的所有具体数据结构可能不是标准所要求的,但它们对于记住帮助将规则链接到具体内容非常有用)

std::string〜= std::vector; 它是一个动态数组,如果你继续推动元素的结束,它会在某个时候重新分配你的元素.

std::list:每个元素都是一个新的链表节点,因此无论何时插入新元素,都不会发生重新分配.

std::deque:它通常由几页元素组成; 当页面已满时,将分配一个新页面并将其添加到页面列表中; 因此,不会重新分配您的元素,如果您在开始或结束时继续推送内容,则您的元素永远不会被移动.

std::map/ std::multimap/ std::set/ std::multiset:通常的二进制树中,每个元件在其自身的分配; 没有进行任何重新分配.

std::unordered_map/ std::unordered_multimap/ std::unordered_set/ std::unordered_multiset:一个哈希表; 当表格足够时,会发生重新散列和重新分配.