我对STL C ++中的内存重新分配感到有些困惑。例如,我知道如果我声明一个vector
,并继续将元素推回到它中,向量将在某个时刻需要重新分配内存空间并将所有现有元素复制到其中。对于链表,不需要重新分配,因为元素不是连续存储在堆栈中,每个元素都使用指针指向下一个元素。
我的问题是,C ++中其他STL的情况如何?例如,string
,map
,unordered_map
?他们需要重新分配吗?
答案 0 :(得分:7)
(免责声明:此处指定的所有具体数据结构可能不是标准所要求的,但它们对于记住帮助将规则链接到具体内容非常有用)
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
:哈希表;当表格足够时,会发生重新分配和重新分配。
答案 1 :(得分:0)
几乎所有STL容器的内存都分配在堆上,即使是向量也是如此。纯数组和std :: array模板是唯一可能在堆栈上具有内存的模板。
如果您的问题是关于连续内存分配(无论是在堆栈上还是堆上),则普通数组std :: array,std :: vector可能具有连续内存。几乎所有其他容器(例如列表,双端队列,映射,集合等)都没有连续分配内存。