理解这两个方法的区别之前,需要先搞清楚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]),程序就会报错。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐