std::list是否指向相同的内存?

Does a std::list point to the same memory?

本文关键字:内存 list 是否 std      更新时间:2023-10-16

我想知道std::list是否指向相同的内存,如std::vector,如果一个元素是,例如,push_back ed,它只是使用new分配,它指向其他元素(与nextprev)?

template<class T>
    struct node
    {
    node<T> *next, *prev;
    T value;
    };     

标准只保证vector返回指向第一个元素地址的连续内存块的指针,而list则不是这样

首先,std::vector不会在push_back之后指向相同的内存,至少不是一直指向相同的内存:如果分配的大小不足,std::vector将重新分配其内部数据块,因此它将指向内存中的不同位置。

std::vector不同,std::list是一个链表,因此它的头将放在push_back之后的内存中相同的位置。但是,std::list不支持对其元素的快速随机访问。

标准没有精确说明容器是如何实现的(list, deque, vector,…),但是要求是如此严格,通常可以推断出来。

例如,大小为Nstd::vector必须保证[0, N)中的&vec[0] + i = &vec[i]对应i(这是一种花哨的措辞,意味着它具有连续存储)。

另一方面,std::list必须保证:
  • 插入/移除O(1)
  • 的插入/删除不会影响列表中任何其他元素:指向它们的迭代器不会失效,并且它们的地址是稳定的

这种稳定性意味着一个基于节点的容器,因此规范实现是一个双链表。

我也不知道。两个容器都拥有自己的元素,因此将元素插入到容器中需要创建一个新元素。必须是这样。原因:

{
    SomeContainer <T> container;
    {
        T element;
        container.push_back(element);
    }
    // Here

此时,element不在作用域中,不再存在,但是容器仍然在作用域中。所以容器必须已经创建了自己的T与不同的作用域