ACM学习历程7——Vector向量容量扩展机制

原创 2016年08月23日 16:14:17

Vector向量容器相当于一个动态的数组,当向向量容器中不断加入元素,若超过容器本身的大小限制,vector会自动拓展大小,在这过程中涉及到内存的分配和回收。vector中有size()capacity()函数,与之相对应的两个函数resize(size_type)reserve(size_type)Size函数是指返回当前容器中的元素个数,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小。Capacity指最少要多少元素才会使其容量重新分配,对应reserve(size_type new_size)会置这个capacity值,使它不小于所指定的new_size。有了这两个函数,可以通过下面的代码来测试一下,缺省情况下Vector的扩展机制是怎样。

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v;
	vector<int>::size_type tmp = 0;
	ofstream ofs("resize.txt");
	for (int i = 0, j = 1; i < 10000000; i++)
	{
		v.push_back(i);
		if (v.capacity() != tmp)
		{
			cout << j << " " << v.capacity() << endl;
			ofs << j << " " << v.capacity() << endl;
			tmp = v.capacity();
			j++;
		}
	}
	return 0;
}
执行的结果如下:

从第二例数据可以看出,缺省情况下vector的扩展机制是按2倍拓展的也就是指数递增。在整个大小拓展的过程中,主要的步骤如下:

1)为需要的新容量分配足够的内存;

2)将元素从原来的内存拷贝到新内存中;

3)销毁原来内存中的元素;

4)归还原来的内存。   

如果元素的数目为n,那么我们知道步骤(2)(3)都要占用O(n)的时间,除非分配或归还内存的代价的增长超过O(n),否则这两步将在全部运行时间中占居支配地位。因此我们可以得出结论:无论用于重新分配的容量(capacity)是多少,重新分配一个 大小(size)为nvector需要占用O(n)的时间。这个结论暗示了一种折衷权衡。假如在重新分配时请求大量的额外内存,那么在相当长的时间内将无需再次进行重新分配,因此总体重新分配操作消耗的时间相对较少,这种策略的代价在于将会浪费大量的空间。另一方面,我们可以只请求一点点额外的内存,这么做将会节约空间,但后继的重新分配操作将会耗费时间。换句话说,我们面临一个经典的抉择:拿时间换空间,或者拿空间换时间。当然在ACM题目的解答过程中,一般会告知数据的范围,这样我们可以定义vector容器的大小,即使没有告知数据量的大小,但是一定要避免陷入vector容器自增长造成内存空间的浪费。当然,当vector容量不够用的时候我们可以根据需要定义需要拓展的大小。

#include <iostream>
#include <vector>
using namespace std;

void showInfo(vector<int> &v)
{
	int i;
	for(i=0;i<v.size();i++)
		cout<<v[i]<<" ";
	cout<<endl;
}

int main()
{
	vector<int> v;
	int i;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	//此时v的实际大小
	cout<<"size="<<v.size()<<endl;
	showInfo(v);
	//根据需要拓展大小
	v.resize(10);
	v.insert(v.begin()+4,5);
	cout<<"size="<<v.size()<<endl;
	showInfo(v);
	return 0;
}

版权声明:本文为博主原创文章,转载注明出处!

vector内存增长方式

vector可以理解为动态数组,既然是数组,那么它在内存中就应该是一块连续的内存,但vector是如何支持动态增长的呢?...
  • qq_26849233
  • qq_26849233
  • 2017年04月25日 13:53
  • 1489

关于vector大小(size)和容量(capacity)总结

主要介绍了vector 容器大小相关的操作函数(size、max_szie、capacity),同时介绍了容器大小超出容器capacity能力会内存重新分配以及iterator失效简单分析。同时给出了...
  • xiao3404
  • xiao3404
  • 2016年04月08日 22:37
  • 16877

python中创建指定大小的多维数组

创建指定大小的
  • geniusluzh
  • geniusluzh
  • 2014年04月23日 16:41
  • 40987

C++中vector内存扩充机制

为了支持随机访问,vector中的元素采用顺序存放,即每一个元素紧挨着前一个元素进行存储。那么现在只有可能出现问题了,当内存中没有足够连续的空间去存放新插入来的元素怎么办,C++是这样处理的:重新分配...
  • nhf_a
  • nhf_a
  • 2016年08月22日 21:33
  • 1182

C++ vector长度扩展机制的探究

源起: C++ Primer 第五版,Exercise 9.38 Write a program to explorer how vectors grow in the library you u...
  • jmy5945hh
  • jmy5945hh
  • 2014年09月09日 21:11
  • 2718

vector的自动扩容

#include "stdafx.h" #include #include using namespace std; int main() { vectora(10), b(10); co...
  • u012220365
  • u012220365
  • 2015年09月29日 21:41
  • 1717

关于vector的容量增长问题

“默认情况下,C++标准库提供了合理的性能”。如果你对“合理的”一词暗含的意思有过好奇,请接着读下去…… 引言 假设我们希望从一个文件中将一串类型为double的值读进一个数据结构中,从而...
  • wangchao701123
  • wangchao701123
  • 2017年04月22日 13:48
  • 464

c++ vector的容量增长方式

以前一直以为vector的capacity的增长方式是翻倍增长的,但是实验了一下,并不是所想的那样 *2增长。当然也是按照一定的规律去增长,具体是什么规律,不同的编译器应该有不同的实现吧。 ...
  • soloopin
  • soloopin
  • 2012年11月27日 17:32
  • 5425

ArrayList和Vector区别以及其扩容机制

ArrayList和Vector区别以及其扩容机制 相同点:   1、ArrayList和Vector都是继承了相同的父类和实现了相同的接口     (extends AbstractList im...
  • dietime1943
  • dietime1943
  • 2017年01月09日 15:40
  • 895

ACM学习历程6——Vector向量容器

Vector向量容器属于第一类容器,支持级访问迭代器,与数组不同的是,向量容器在内存用尽时,会自动分配更大的连续内存区,将原来的元素复制到性的内存区中,并释放旧的内存区。Vector实际上相当于一个动...
  • u010480899
  • u010480899
  • 2016年08月23日 15:07
  • 505
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ACM学习历程7——Vector向量容量扩展机制
举报原因:
原因补充:

(最多只允许输入30个字)