4

この回答から:

パフォーマンスの問題が発生する可能性のある場所の 1 つは、ベクターのサイズを最初から正しく設定していないことです。

では、ベクトルがクラスのプロパティである場合、ベクトルのサイズを正しく設定するにはどうすればよいでしょうか? ベクトルの容量を(初期化時に)設定する(最良の)方法はありますか?

4

2 に答える 2

2

Yes there is. See the reserve method. It will request that a vector's capacity be at least enough to contain the number of elements sent as its argument. If you can anticipate an upper bound on the number of items that you want to store in a vector, then you can reserve that amount of space in your vector.

Example from the above link -

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

You will see that as you add more elements to the foo vector, its capacity keeps increasing, but in the second case, since it has already reserved 100 element's space, the capacity is changed only once.

Here is a running example.

于 2012-12-05T12:15:50.003 に答える
1

コンストラクター中にクラスに値が与えられることを考えると、ベクトルの初期サイズを格納するのが賢明です。最初にベクトルの基数を設定するのではなく、ユーザーが常にベクトルのサイズを拡張していると、効率が悪くなります。

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

初期サイズを設定すると、プログラムでベクトルを拡張する必要がある回数が減ります。

編集: または予約メソッドはほぼ同じことを行いますが、予約関数が存在することを知りませんでした (非常に便利です!)。

于 2012-12-05T12:21:56.167 に答える