在C++中,只需使用push_back方法即可将元素添加到矢量中。该方法修改矢量的大小。 那么使用std :: vector :: reserve的目标是什么?我应该什么时候使用它?为什么使用std :: vector :: reserve有用?
回答
当您知道至少有n个元素进入矢量时,您可以使用保留。调整容器大小是一项代价高昂的操作 - 您分配新内存,将旧内容复制到内存中,然后删除旧的内存。如果您默认知道您将获得至少10000个元素,则最好为矢量保留大小,而不是让矢量重新分配内存超过必要的次数。
简而言之,就是效率。
比效率更重要:它确保迭代器保持有效。 –
调整载体可以显著降低执行速度(例如追加大量的数据给它时)
基准表示:
This effectively increases the container size by one, which causes an automatic
reallocation of the allocated storage space if -and only if- the new vector size
surpasses the current vector capacity.
所以有助于尺寸的向量上的值,其中你理想情况下,对于您的所有数据来说都足够了,而且还没有剩下。矢量缩减的调整大小时间将加速您的应用程序
这是出于效率的原因 - 您可以根据需要为内存分配尽可能多的元素,如果您知道初始化 - 这种方式向量可以一次分配所有内容,并且如果超过分配的大小将不会增加。
[4] Reserve()会导致手动重新分配。 使用reserve()的主要原因是效率:如果您知道您的最终容量必须增长,那么通常更有效率的是一次分配该内存,而不是依靠自动的 重新分配方案。使用reserve()的另一个原因是你可以控制迭代器的失效。
它可以用来保证迭代器的有效性,或作为优化。向矢量添加元素时,如果新大小大于容量,则矢量必须重新分配,将所有现有元素复制(或移动)到新缓冲区中。这使所有迭代器都无效,并且可能很昂贵。储备功能确保最小的容量。如果您事先知道最大大小并对其进行预留,那么添加元素将永远不会使新元素前面的迭代器失效,并且永远不会需要复制。 (对于大多数代码,这是迭代器有效性的问题,强制使用保留。)
- 1. std :: vector reserve()和push_back()比resize()和数组索引快,为什么?
- 2. vector :: reserve是做什么用的?
- 3. std ::使用std :: vector :: reserve时,排序顺序是从最大到最小的?
- 4. std :: set和std :: vector有什么区别?
- 5. 使用std :: vector作为std :: map的关键字在未找到并使用reserve()时未返回end()
- 6. 为什么不是std :: string是std :: vector的专门化?
- 7. 在调用vector :: assign()之前调用vector :: reserve()会更好吗?
- 8. 什么是std :: vector :: front()用于?
- 9. 使用std :: vector的
- 10. 为什么std :: vector需要operator =
- 11. 为什么不需要使用“新”来初始化std :: vector?
- 12. 为什么我不能使用std :: vector元素的别名?
- 13. 为什么使用new运算符而不是std :: vector?
- 14. 为什么std :: vector和std :: array的C++ initializer_list行为不同?
- 15. 在MATLAB中预先分配内存àla std :: vector :: reserve(n)
- 16. 正在访问std :: vector :: reserve safe之后的原始指针吗?
- 17. boost :: container :: vector比std :: vector更快吗?为什么?
- 18. 为什么std :: move使用std :: remove_reference?
- 19. 为什么std :: fstream使用char *?
- 20. 为什么要用cl :: vector?
- 21. 推入std :: vector时std :: unique_ptr的正确用法是什么?
- 22. 为什么std :: vector fill构造函数不能启用安装?
- 23. 为什么unique_ptr可以用于std容器,vector <>例如?
- 24. 使用strcpy与std :: vector
- 25. std :: vector bad_alloc不使用push_back
- 26. OpenGL:使用VBO与std :: vector
- 27. 使用std :: lower_bound与std :: vector :: const_iterator
- 28. 使用std :: unary_function清除std :: vector指针
- 29. std :: shared_ptr有什么问题<std :: vector <double>>
- 30. 为什么没有在gcc-4.9.1-4ubuntu2中手动输入std :: vector?
它是最小化或彻底消除缓冲区调整大小和引入的命中(复制/移动会变得昂贵,特别是对于大型对象的数量)。在'operator new/delete'宇宙中没有'realloc'等价物。要“扩展”分配,需要单独分配,复制或移动,然后释放旧内存。通过“声明”你的意图,你可以避免这种细微差别。一只卑鄙的兔子很可爱。百万平均的兔子是一个问题)。 – WhozCraig