Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确调整向量的大小?_C++ - Fatal编程技术网

C++ 如何正确调整向量的大小?

C++ 如何正确调整向量的大小?,c++,C++,发件人: 您可能会遇到性能问题的一个地方是,首先没有正确调整向量的大小 那么,当向量是一个类的属性时,如何正确地调整它的大小呢?是否有(最佳)方法设置向量的容量(初始化时)?有。参见方法。它将要求向量的容量至少足以包含作为其参数发送的元素数。如果可以预测要存储在向量中的项数的上限,则可以在向量中保留该数量的空间 上面链接中的示例- // vector::reserve #include <iostream> #include <vector> int main () {

发件人:

您可能会遇到性能问题的一个地方是,首先没有正确调整向量的大小

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

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

上面链接中的示例-

// 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;
}
//向量::保留
#包括
#包括
int main()
{
std::vector::size_type sz;
std::矢量foo;
sz=foo.capacity();

std::cout考虑到类在构造过程中给定了一个值,聪明的做法是存储向量的初始大小。当用户不断扩展向量的大小而不是设置向量的基长度时,效率就会降低

//consider the vector reads in chars from a string
VecClass::VecCalss(char * str)
{
    size_t LEN = strlen(str);
    Vect = std::vector<char>(LEN, '\0'); //start with the initial size of the char
}
//考虑向量从字符串中读取字符
VecClass::veccals(char*str)
{
尺寸长度=strlen(str);
Vect=std::vector(LEN,'\0');//从字符的初始大小开始
}
设置初始大小可以减少在程序中需要扩展向量的次数


编辑:或者reserve方法也会做同样的事情,从不知道存在一个reserve函数(非常方便!)。

未能
reserve
的代价是巨大的,但并不荒谬。如果
向量
的容量增长了phi(黄金比率)的一倍每次你通过它时,如果我做得正确的话,做naive
push_back
会导致你平均复制每个元素2.6次:
(1/(1-1/phi))
。我了解到phi容量乘数是典型的,一般来说,标准要求某种指数级的容量增长。有一件事你不应该做,那就是在每次
回推
调用
向量保留(vec.capacity()+1)
之前。这将是O(n^2)你自己……YAKK——STL(在它被采纳为C++标准之前)的最初实现使用了2的增长因子。