49508


Vectorで`.capacity`は現在のデータ領域容量を返す関数、`.size()`は要素を返す関数と説明があるのですが、値が同じで戻り値が`size_t`のため二つの違いがわかりません。教えてくれますでしょうか？

[code]

    void veiw(vector<int> &v)
    {
        unsigned int i = 0;
        for (; i < v.size(); i++)
        {       
            cout <<"["<< i << "] " << v[i]<<" ";
        }
        cout << "\n\n\n";
    }
    
    int main() {
    
        vector<int> data2{1,2,3,4,5,6,7,8,9,10};
        vector<int> data;
    
        veiw(data2);
    
        int f = data2.capacity();
        int x = data2.size();
        cout << f <<"\n";
        cout << x;
        veiw(data);
    
        _getch();
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2018-10-21T12:12:26.090
49503
2018-10-23T03:30:25.543
2018-10-23T03:30:25.543
3060
question
c++
Vectorの.capacity()と.size()の違いについて知りたい


あなたがお調べになった通りですとしか言いようがないんですが、

`capacity()`は現在割り当てられている領域の容量  
`size()`は実際に使われている要素数

です。値が同じになるコードではピンとこないでしょうが、`main`関数を例えば次のように書き換えてみてください。

[code]

    int main() {
        vector<int> data2{1,2,3,4,5,6,7,8,9,10};
    
        veiw(data2);
    
        size_t f = data2.capacity();
        size_t x = data2.size();
        cout << f << "\n";
        cout << x << "\n";
    
        data2.pop_back();
        data2.pop_back();
    
        //#2
        cout << data2.capacity() << "\n";
        cout << data2.size() << "\n";
    
        veiw(data2);
    
        data2.push_back(11);
        data2.push_back(12);
        data2.push_back(13);
    
        //#3
        cout << data2.capacity() << "\n";
        cout << data2.size() << "\n";
    
        veiw(data2);
    
    //    _getch(); //必要ならコメントインしてください
        return 0;
    }
    
[/code]

#2では、`data2.capacity()`の方が10、`data2.size()`の方は8と出力されていると思います。データを1個減らしても割り当て容量は減らさないのです。

`vector`内部ではこんな感じです。

[code]

    |<- capacity():実際にメモリ割り当てが済んでいる要素数 ->|
    |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 |
    |<-    size():実際に使われている要素数    ->|<-未使用->|
    
[/code]

* * *

また、`vector`が要素を追加した時に割り当て済みのメモリが足りなくなると、メモリの再割り当て(割り当て済みメモリのサイズ変更)が必要になり、そのような場合にも「未使用領域」ができ、`capacity()`の値と`size()`の値が変わってきます。

[code]

    data2.push_back(11);
    
    |<- capacity():実際にメモリ割り当てが済んでいる要素数 ->|
    |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 | 11 | 10 |
    |<-      size():実際に使われている要素数       ->|未使|
    
    data2.push_back(12);
    
    |<- capacity():実際にメモリ割り当てが済んでいる要素数 ->|
    |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 | 11 | 12 |
    |<-         size():実際に使われている要素数         ->|
    
    data2.push_back(13); //->割り当て済みの領域では足りないので、再割り当てが発生する
    
    |<-                          capacity():実際にメモリ割り当てが済んでいる要素数                          ->|
    |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 | 11 | 12 | 13 | xx | xx | xx | xx | xx | xx | xx | xx | xx |
    |<-           size():実際に使われている要素数            ->|<-                  未使用                 ->|
    
[/code]

(実際に一挙に2倍になるかどうかは、処理系により異なります。)

* * *

領域の再割り当てはかなり重い処理になるので、それが要素1個の増減くらいでは発生しないように、割り当て済みの領域容量と実際に使われている要素数を別々に管理しています。いつでも同じ値になるわけではありません。


CC BY-SA 4.0
2018-10-21T16:06:10.943
49508
2018-10-22T00:34:29.350
2018-10-22T00:34:29.350
13972
13972
49503
answer