如果 std::vector 包含的元素变大,是否必须调整大小?

Does std::vector have to resize if the elements it contains grow in size?

如果这是一个太基础的问题而不能在这里提出,我深表歉意;我一直在阅读一些关于 std::vector 的文章,我知道当大小达到容量时它必须调整大小。如果它包含的对象很大,这可能是一项昂贵的操作,因为它必须复制每个对象。

我的问题是:std::vector 如何处理它包含的对象的实际大小增长?假设我初始化一些

std::vector<Obj> vec(100);

并且每个 Obj 都被初始化为非常小的东西。但是如果我然后做类似

的事情呢?
vec[14].ENGORGIO()

所以它现在需要更多的内存。由于 std::vector 的元素存储在连续的内存中,这是否意味着它必须调整大小(昂贵!)

为了避免这种情况,我是否应该将指针存储在向量中而不是对象本身?像这样

std::vector< std::unique_ptr<Obj> > vec;

谢谢

每种类型都有一个大小,并且该类型的所有对象都具有相同的大小。对象的大小在整个程序中永远不会改变。所以你描述的场景是不存在的。

vector"resizes"不改变vector对象大小的方式是通过间接实现的。这些元素不是对象内存的一部分。相反,向量指向动态内存中的缓冲区。调整大小是通过创建一个更大的动态缓冲区,并在销毁旧缓冲区之前从旧缓冲区复制元素来完成的。

C++ 中数据类型的大小是在编译时设置的,不能更改。数据类型可能包含对其他对象的引用,这些其他对象的大小可能会有所不同,但引用的大小以及数据类型是不变的。

考虑 vectorvector。内部 vector 可能包含 0 个元素或数十亿和数十亿,并且它将始终具有相同的大小。外层vector只知道它包含0个或多个vector,而对内层vector的内容一无所知。

这个你不用担心。