如果 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++ 中数据类型的大小是在编译时设置的,不能更改。数据类型可能包含对其他对象的引用,这些其他对象的大小可能会有所不同,但引用的大小以及数据类型是不变的。
考虑 vector
个 vector
。内部 vector
可能包含 0 个元素或数十亿和数十亿,并且它将始终具有相同的大小。外层vector
只知道它包含0个或多个vector
,而对内层vector
的内容一无所知。
这个你不用担心。
如果这是一个太基础的问题而不能在这里提出,我深表歉意;我一直在阅读一些关于 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++ 中数据类型的大小是在编译时设置的,不能更改。数据类型可能包含对其他对象的引用,这些其他对象的大小可能会有所不同,但引用的大小以及数据类型是不变的。
考虑 vector
个 vector
。内部 vector
可能包含 0 个元素或数十亿和数十亿,并且它将始终具有相同的大小。外层vector
只知道它包含0个或多个vector
,而对内层vector
的内容一无所知。
这个你不用担心。