C++ Vector中capacity与size 


std :: vector在堆上分配一个内存,并将其所有元素存储在连续的内存位置。

但是,如果最初分配的内存被完全填满怎么办?
例如,让我们创建一个整数向量,即std :: vector <int>。现在假设它的初始容量是存储10个元素,但是在我们的应用程序中,我们想在其中存储15个元素。那么当我们插入第11个元素时会发生什么?

当std :: vector的内部存储器完全完成时,它将增加其存储器的大小。为此,它执行以下步骤,

  • 它将在堆上分配更大的内存块,即几乎是先前分配的大小的两倍。
  • 然后将所有元素从旧的存储位置复制到新的位置。是的,它会复制它们,因此,如果我们的元素是用户定义的对象,则将调用其复制构造函数。这使得此步骤在速度方面相当繁重。
  • 成功复制后,它将删除旧的内存。

您可以使用Capacity()成员函数检查向量的当前容量,即它可以在当前分配的内存中存储多少元素。
要检查std :: vector中当前存储的元素数,可以使用size()成员函数。

#include <iostream>
#include <vector>
struct Sample
{
    Sample(){}
    Sample(const Sample & obj)
    {
        std::cout<<"Sample copy constructor"<<std::endl;
    }
};
int main()
{
    std::vector<Sample> vecOfInts;
    std::cout<<"Capacity :: "<<vecOfInts.capacity()<<std::endl;
    std::cout<<"Size :: "<<vecOfInts.size()<<std::endl;
    int capcity = vecOfInts.capacity();
    for(int i = 0; i < capcity + 1; i++)
        vecOfInts.push_back(Sample());
    std::cout<<"Capacity :: "<<vecOfInts.capacity()<<std::endl;
        std::cout<<"Size :: "<<vecOfInts.size()<<std::endl;
    for(int i = 0; i < capcity + 1; i++)
            vecOfInts.push_back(Sample());
    std::cout<<"Capacity :: "<<vecOfInts.capacity()<<std::endl;
    std::cout<<"Size :: "<<vecOfInts.size()<<std::endl;
    return 0;
}

输出打印如下:

Capacity :: 0
Size :: 0
Sample copy constructor
Capacity :: 1
Size :: 1
Sample copy constructor
Sample copy constructor
Capacity :: 2
Size :: 2

 

+1



error: 内容受到保护 !!