包含容器的容器的C 生长

C++ Growth of containers containing containers?

本文关键字:生长 包含容      更新时间:2023-10-16

如果我有 std::vector<std::set<int>>。如果您插入其能力,则向量将重新分配。如果您在向量内有另一种可重大类型的情况,则向量仅保留指向上述类型的指针?

特别想知道如果向量有任意类型,我想知道如何分配内存。

std::vector<int> a(10); //Size will be sizeof(int) * 10
std::vector<std::set<int>> b(10);
b[0] = {0, 0, 0, 0, 0, 0, 0, .... }; //Is b's size effected by the sets inside?

c 对象只能具有一个大小,但可能包括指数以任意尺寸的堆内存。因此,是的,容器对象本身通常包括指向堆内存的指针,并且可能不包括任何实际项目。(唯一的典型例外是字符串类型,有时具有"小字符串优化",允许字符串对象直接在对象中包含小字符串而无需分配堆内存。)

任何向量将自己分配"本身"的内存始终是sizeof(element_type) * vector.size()。

矢量只能为可见的编译时间可见的元素数据分配内存。它不在乎元素类完成的任何分配。

将矢量视为类固醇的阵列。像数组一样,向量由一个连续的内存块组成,所有元素的大小都相同。要使此要求充分说明,必须在编译时知道每个元素的大小。

想象一个std ::设置具有这些成员变量:

struct SomeSet
{
   size_t size;
   SomeMagicInternalType* data;
};

因此,无论在运行时如何分配data ,向量仅将每个元素的内存分配给 compile Time

sizeof(someset :: size) sizeof(someset :: data)

在32位机器上将是4 4。

考虑此示例:

#include <iostream>
#include <vector>
int main() {     
    std::vector<int> v;
    std::cout << sizeof(v) << "n";
    std::cout << v.size()  << "n";
    v.push_back(3);
    std::cout << sizeof(v) << "n";
    std::cout << v.size()  << "n";     
}

确切的数字可能会有所不同,但我以输出为:

24
0
24
1

添加元素时,vector的大小(大小=对象的大小)不会更改。set也是如此,因此vector<set>如果其元素之一添加或删除元素,则不需要重新分配。

一组不会将其元素存储为成员,否则具有不同数量元素的集合将是不同的类型。它们存储在堆上,因此不会直接导致set的大小。

a std::vector<T>保存类型T的对象。调整大小时,它会根据需要复制或移动这些对象。std::vector<std::set<int>>没有什么不同;它拥有类型std::set<int>的对象。