C++におけるcapacity()の使い方のまとめ

3888 ワード

1、定義
C++では,capacityとsizeの違いを理解することが重要である.コンテナのsizeとは、保存されている要素の数を指します.capacityは、新しいメモリ領域を割り当てずに最大どれだけの要素を保存できるかです.
関数#カンスウ#
機能
capacity()
コンテナがデータを格納できる個数
size()
容器の現在存在する要素数
reserve()
コンテナに格納できるデータの数を指定します.
resize()
有効要素の個数を再指定し、reserve()指定容量と区別する
空のコンテナを作成すると、容量(capacity)は0になります.使い切ると、元の容量の1/2が増加します. 
vectorのような要素が連続的に格納されているコンテナが適用され、listのように異なります. 
Capacityがsizeより一般的に大きいのは、データを増やすたびにメモリを再割り当てしないようにするためであり、その後のデータ挿入のために大きなスペースが生成されるのが一般的である.
2、例を挙げて説明する
example1
vector v;  //       ,  size() capacity()  0;
cout<<v.size()<<endl<<v.capacity()<<endl;
v.push_back(1);
cout<<v.size()<<endl<<v.capacity()<<endl;//           ,  size() capacity()  1
v.push_back(1);
cout<<v.size()<<endl<<v.capacity()<<endl;//            capacity()    ,      ,     ,            2 ,     2 ,       ,size() 2,capacity()  2
v.push_back(1);
cout<<v.size()<<endl<<v.capacity()<<endl;//            2,     ,  ,      ,         2 ,  4 ,  size() 3,capacity() 4
v.push_back(1);
cout<<v.size()<<endl<<v.capacity()<<endl;//           ,        ,size() 4,capacity() 4
v.push_back(1);
cout<<v.size()<<endl<<v.capacity()<<endl;//    ,    ,size() 5,capacity 8

example2
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> ivec;
    cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
    //  10   
    for(int i = 0; i < 10; ++i)
    {
        ivec.push_back(i);
        cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
    }
    //     
    while(ivec.size() != ivec.capacity())
        ivec.push_back(0);   //  1   
    cout<<"size = capacity. insert one element
"; ivec.push_back(0); cout<<"capacity:"<<ivec.capacity()<<" size:"<<ivec.size()<<endl; ivec.reserve(100); cout<<"reserve capacity 100
"; cout<<"capacity:"<<ivec.capacity()<<" size:"<<ivec.size()<<endl; // while(ivec.size() != ivec.capacity()) ivec.push_back(42);// 1 cout<<"size = capacity. insert one element
"; ivec.push_back(0); cout<<"capacity:"<<ivec.capacity()<<" size:"<<ivec.size()<<endl; system("pause"); return 0; }

3、capacity()とmax_size()比較capacity:コンテナのメンバー関数capacity()取得max_size:コンテナのメンバー関数max_size()は、STLコンテナのcapacity属性を取得し、STLがreallocが発生する前に許容できる最大要素数を表し、予め割り当てられたメモリ空間としても理解できる.たとえば、1つのvectorvのcapacityは5であり、6番目の要素を挿入するとvectorはreallocし、vector内部のデータは別のメモリ領域にコピーされます.これにより、vector内の要素を指すポインタ、反復器などが無効になります.  max_size属性はcapacityとは異なり、STLコンテナで許容される最大要素数を表し、通常、この数は大きな定数であり、無限大と理解できる.この数はプラットフォームと実装に関連しており、私のマシン上でvectorのmax_sizeは1073741823でstringのmax_sizeは4294967294です.なぜならmax_sizeが大きい~だから基本的にmaxを超える元素数は発生しませんsizeの場合、両者の違いを知るだけでよい.
4、一部の容器とcapacity(1)はすべての容器でreallocが発生するわけではない.List,Map/Multimap,Set/Multisetの要素はメモリに散布され、メモリが予め割り当てられていないためreallocが発生しない.これらの容器ではcapacityは意味がないため、これらの容器にはcapacity()メンバー関数もcapacity属性もない.(2)deque双方向キューの場合は特殊であり,dequeはメモリをブロック化し,一定サイズのブロックを割り当てるたびに1つのブロックが満たされた後に新しいブロックが開かれるのも散布−連続混在の場合であり,dequeはメモリ空間を予め割り当てるがrealloc(alloc)は発生しないためcapacity属性も持たない.(3)実際にcapacity属性を持つコンテナはvectorとstringのみであり、実装によってcapacityも異なる.構造的にcapacityを設定するほか、reserve(n)を用いてコンテナオブジェクトのcapacityを設定し、その後のreallocを回避することもできる.しかし、このプロセスは増減しないだけであり、nが現在のcapacityより小さい場合、reserve(n)は無効である.
参考資料:
C++コンテナのsize()、capacity、reserve()、resize()関数説明C++のcapacity()関数の使い方C++のVECTORのsize()とcapacity()で値をとる