vector容器中size与capacity的区别
理解这两个方法的区别之前,需要先搞清楚vector的原理。vector底层是一个动态数组,插入元素时会申请新的空间,但考虑到效率问题,并不是每插入一个元素,就申请一个空间,而是事先先申请好一段空间,开始插入元素,当空间不足时,再重新申请一块更大的空间。并将原来空间中的数组拷贝到新空间中,再继续插入元素。而size就是vector中元素的个数,而capacity就是vector申请的内存空间的大小。
理解这两个方法的区别之前,需要先搞清楚vector的原理。vector底层是一个动态数组,插入元素时会申请新的空间,但考虑到效率问题,并不是每插入一个元素,就申请一个空间,而是事先先申请好一段空间,开始插入元素,当空间不足时,再重新申请一块更大的空间。并将原来空间中的元素拷贝到新空间中,再继续插入元素。
而size就是vector中元素的个数,而capacity就是vector申请的内存空间的大小。
我们用动态数组举个例子,给arr动态申请了一块内存,大小为20个sizeof(int)。此时arr中我们还没有添加数据,只是申请了一块内存,告诉操作系统,我后面要用这块内存,你不准给别人用。此时的size就是0,而capacity就是20。
int *arr = new int[20];
下面写一个例子看下size和capacity的大小。
std::vector<int> v1;
for (int i = 0; i < 20; i++)
{
v1.push_back(i);
}
std::cout <<"v1.size = "<<v1.size() << std::endl;
std::cout << "v1.capacity = " << v1.capacity() << std::endl;
从上面例子可以看出,我们插入20个元素后,size大小是20,capacity大小为28。也就是vector中有20个元素,但vector为我们申请了28个sizeof(int)大小的空间。
size和capacity可能会相等,也可能不等,但capacity一定是比size大的。
需要注意的是:虽然上述例子中capacity大小为28。但我们不能去访问21到28区间块的数据,因为这块区域内我们还未插入数据,这样去访问数据(v1.at(22)或者v1[22]),程序就会报错。
更多推荐
所有评论(0)