如何正确调整矢量的大小

How to size a vector properly?

本文关键字:何正确 调整      更新时间:2023-10-16

来自这个答案:

您可能会遇到性能问题的一个地方是一开始就没有正确调整矢量的大小。

那么,当向量是类的属性时,如何正确调整向量的大小呢?有没有(最佳)方法来设置矢量的容量(初始化时)?

是的,有。请参阅保留方法。它将要求向量的容量至少足以包含作为其参数发送的元素数。如果可以预测要在向量中存储的项目数的上限,则可以在向量中保留该空间量。

上面链接中的示例 -

// 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
}

设置初始大小可减少在程序中需要扩展矢量的次数。

编辑:或者保留方法将做同样的事情,从来不知道保留函数的存在(非常方便!