c++ - 如果 std::vector 包含的元素大小增加,它是否必须调整大小?
问题描述
如果这是一个太基本的问题,无法在这里提出,我深表歉意;我一直在阅读一些关于 std::vector 的内容,并且我知道当大小达到容量时它必须调整大小。如果它包含的对象很大,这可能是一项昂贵的操作,因为它必须复制每个对象。
我的问题是:std::vector 如何处理它所包含的对象的实际大小增长?假设我初始化了一些
std::vector<Obj> vec(100);
每个 Obj 都被初始化为非常小的东西。但是如果我然后做类似的事情怎么办
vec[14].ENGORGIO()
所以它现在需要更多的内存。由于 std::vector 的元素存储在连续的内存中,这是否意味着它必须调整大小(昂贵!)
为了避免这种事情,我应该将指针存储在向量中而不是对象本身吗?像这样
std::vector< std::unique_ptr<Obj> > vec;
谢谢
解决方案
C++ 中数据类型的大小是在编译时设置的,不能更改。数据类型可能包含对其他对象的引用,并且这些其他对象的大小可能不同,但引用的大小以及数据类型是不变的。
考虑svector
中的一个vector
。内部vector
可能包含 0 个元素或数十亿个元素,并且它始终是相同的大小。外部vector
只知道它包含 0 个或多个vector
s,而对内部 s 中包含的内容一无所知vector
。
您不必担心这一点。
推荐阅读
- database - 为什么在 SequoiaDB 中插入数据后会报重复键错误?
- microsoft-cognitive - Why is Bing Custom Search API throwing an error when I make a call through node-js?
- php - Update query is not working in codiegniter
- java - 我使用下面的代码在 netbeans 中打印了一个 JFrame,但它不起作用
- python - 导入图像(.jpg)数据集 Keras、Pandas 的正确方法
- javascript - 需要加入x轴和y轴标签highcharts
- javascript - Bootstrap position absolute a link in a textarea
- ios - 即使用户移动到任何 ViewController 并回来,如何使用 MZDownloadManager 更新特定的单元格标签
- c# - System.ArgumentOutOfRangeException:未找到服务配置...参数名称:ITestService
- android - 我在哪里可以找到适用于带有双簧管的新 android studio 项目的 CMakeLists.txt?