代码之家  ›  专栏  ›  技术社区  ›  Ferruccio

假设stl向量存储总是连续的,这样安全吗?

  •  55
  • Ferruccio  · 技术社区  · 16 年前

    如果有一个STL向量已经调整了大小,那么取元素0的地址并假设向量的其余部分将在内存中跟随是否安全?

    例如

    vector<char> vc(100);
    // do some stuff with vc
    vc.resize(200);
    char* p = &vc[0];
    // do stuff with *p
    
    6 回复  |  直到 8 年前
        1
  •  72
  •   einpoklum    8 年前

    是的,这是一个有效的假设(*)。

    从C++ 03标准(23.2.4.1):

    矢量的元素被存储 连续,表示如果v是a 向量,其中t是一些 输入bool以外的类型,然后它服从 的标识 全部0<=n<v.大小()。

    (*)…但是要注意数组在添加元素后被重新分配(使任何指针和迭代器无效)。

        2
  •  27
  •   Michael Burr    16 年前

    C++ 03标准增加了措辞,以明确矢量元素必须是连续的。

    C++ 03 23.2.4第1段包含以下语言 在C++ 98标准文档中:

    元素 vector 存储 连续的,意思是如果 v 是一个 vector<T, Allocator> 哪里 T 是 除了 bool 然后 服从身份 &v[n] == &v[0] + n 为了所有 0 <= n < v.size() .

    Herb Sutter在他的一篇博客中谈到了这一变化, Cringe not: Vectors are guaranteed to be contiguous :

    …连续性实际上是 矢量抽象。很重要, 事实上,当它被发现的时候 C++ 98标准没有 完全保证连续性, C++ 03标准修改为 明确增加担保。

        3
  •  13
  •   Adam Holmberg    16 年前

    存储总是连续的,但它可能随着向量容量的变化而移动。

    如果在容量更改操作之前在元素0(或任何元素)上有指针、引用或迭代器,则它将无效,必须重新分配。

        4
  •  10
  •   Jasper Bekkers    16 年前
        5
  •  4
  •   Kevin Panko Matthew Woodard    13 年前

    std::vector 确保这些项存储在连续数组中,因此是数组的首选替换项,也可以用于与平台相关的低级代码(如win32 api调用)进行接口。要获取指向数组的指针,请使用:

    &myVector.front();
    
        6
  •  2
  •   Keith Nicholas    16 年前

    对。

    它应该总是相邻的