如何正确调整矢量的大小
How to size a vector properly?
来自这个答案:
您可能会遇到性能问题的一个地方是一开始就没有正确调整矢量的大小。
那么,当向量是类的属性时,如何正确调整向量的大小呢?有没有(最佳)方法来设置矢量的容量(初始化时)?
是的,有。请参阅保留方法。它将要求向量的容量至少足以包含作为其参数发送的元素数。如果可以预测要在向量中存储的项目数的上限,则可以在向量中保留该空间量。
上面链接中的示例 -
// vector::reserve
#include <iostream>
#include <vector>
int main ()
{
std::vector<int>::size_type sz;
std::vector<int> foo;
sz = foo.capacity();
std::cout << "making foo grow:n";
for (int i=0; i<100; ++i) {
foo.push_back(i);
if (sz!=foo.capacity()) {
sz = foo.capacity();
std::cout << "capacity changed: " << sz << 'n';
}
}
std::vector<int> bar;
sz = bar.capacity();
bar.reserve(100); // this is the only difference with foo above
std::cout << "making bar grow:n";
for (int i=0; i<100; ++i) {
bar.push_back(i);
// This block will execute only once
if (sz!=bar.capacity()) {
sz = bar.capacity();
std::cout << "capacity changed: " << sz << 'n';
}
}
return 0;
}
您将看到,当您向foo
向量添加更多元素时,其容量不断增加,但在第二种情况下,由于它已经保留了 100 个元素的空间,因此容量仅更改一次。
下面是一个运行示例。
考虑到类在构造函数期间被赋予一个值,聪明的做法是存储向量的初始大小。当用户不断扩展矢量的大小而不是一开始就设置矢量的基本长度时,就会出现效率低下的问题。
//consider the vector reads in chars from a string
VecClass::VecCalss(char * str)
{
size_t LEN = strlen(str);
Vect = std::vector<char>(LEN, ' '); //start with the initial size of the char
}
设置初始大小可减少在程序中需要扩展矢量的次数。
编辑:或者保留方法将做同样的事情,从来不知道保留函数的存在(非常方便!
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- CMake-按正确顺序将项目与C运行时对象文件链接
- 为char数组调整zlib-zpipe
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 用于访问容器<T>数据成员的正确 API
- 如何使用Luacneneneba API正确读取字符串和表参数
- 如何使用用户输入在C++中正确填充2D数组
- node-gyp 在 macOS 上未正确链接库
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 调整向量大小并检索值,这是否正确或在任何情况下都可能导致段错误?
- 如何有效,正确地调整ID3DXFONT大小
- 如何正确调整矢量的大小
- 为什么我的 qt centralWidget(一个 QGLWidget)不能正确调整大小?
- 在 D3D 上正确调整 D2D 的大小
- 快速调整矢量的矢量大小以正确的大小(c++)
- 如何正确恢复窗口7/vista aero快照调整大小的窗口小部件
- ncurses:wgetch在移动/调整窗口大小后无法正确读取
- 正确的全屏调整窗口和 linux C++的大小
- QGLWidget渲染区域没有正确调整大小