3

std::vector では、スペースがなくなるたびにサイズが大きくなることを知っています。しかし、私はそれがどのように成長するかのパターンに気づいていません. 誰かが私にパターンとそれが選ばれた理由を説明してもらえますか.

#include <iostream>
using namespace std;

#include <iostream>
#include <vector>
int main()
{
    vector<int> myVector;
    for(int i =0 ; i < 100; ++i)
    {
        myVector.push_back(i);
        cout << myVector.capacity();
    cout << ", ";
    }
}

結果:

1, 2, 3, 4, 6, 6, 9, 9, 9, 13, 13, 13, 13, 19, 19, 19, 19, 19, 19, 28, 28, 28, 2
8, 28, 28, 28, 28, 28, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 6
3, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 6
3, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 9
4, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 141, 141, 141, 141, 141, 141
4

2 に答える 2

4

実装に依存するため、オペレーティング システムやコンパイラなどを切り替えたときに同じパターンを期待しないでください。

最も一般的な成長パターンは1.5 * previous_capacity2 * previous_capacityです。あなたの例では、前者のようです。

その要因が選択された理由の考えられる説明については、https://stackoverflow.com/a/1100426/784668を参照してください。ポイントは、以前に配列を格納するために使用されていた空きメモリ ブロックを再利用できるように見えることです。

于 2012-09-01T16:06:58.930 に答える
1

これは実装の詳細であり、あなたはそれを気にする必要はありません。あなたの場合、それは次のようなもののようです

i += i/2

しかし、やや複雑です。

于 2012-09-01T16:08:16.637 に答える