在c++语言中,模板容器是一个十分重要的知识点。今天主要学习了vector这个容器,这个容器内是数组,存储的数据是连续的。vector声明定义完成后,可以向该vector压入数据,具体用到的是push_back()这个vector自带的成员函数。但是如何使用指针取出其中的数据呢?

在之前我们提到了vector的[]操纵,这里我们就来学习一下vector类的指针,这里成为迭代器。其类型为vector<int>::iterator,其中的int是vector元素的类型,这个可以定位模板来适应不同的元素。当数组为二维时,可以将定义为vector<vector<int>>::iterator,其他多维都可以此类推。声明后,指针的首地址可以根据对象的成员函数begin()来获得,一直到end()结束。步长是跟元素类型有关,指针加一来指向下一个元素。具体可参考如下代码

        vector<vector<int>> arr;//声明定义二维vector对象arr;
	vector<int> col[10];//定义1维对象col数组。
	for(int i=0;i<10;i++)//给vector对象赋值
	{
		for(int j=0;j<15;j++)
		{
			col[i].push_back(j+i*10);
		}
		arr.push_back(col[i]);
	}
	for(vector<vector<int>>::iterator it = arr.begin();it != arr.end();it++)//通过定义指针(迭代器)来获取二维对象arr的内容。
	{
		for(vector<int>::iterator iit = (*it).begin();iit != (*it).end();iit++)//获得一维vetor对象的col元素。
		{
			printf("%d\r\n",*iit);//逐个打印arr的元素,这里一共有150个元素。
		}
	}
注意这里要包含vector头文件。

vector组如果压入的变量过多,超过了分配的最大内存(MAX_SIZE = 256),vector将分配申请更大的内存,同时将之前的数据拷贝到新内存中去。

在几个STL容器里,vector是个随机访问,并且是连续的。list适合频繁插入数据的,但是内存不连续。Set容器中的元素不能重复。map容器是一一对应。set,map采用了高效的平衡二叉树检索算法,红黑树,拥有更高的插入删除效率。不需要内存移动和内存拷贝,直接替换指向节点的指针即可。Map和HASH_MAP 的区别是HASH_MAP利用了hashmap利用hash算法加速了对元素的查找,但是需要更多的空间来存储这些元素。vector的实质是数组,list实质是链表,Map和Set实质是二叉树。

学习完感觉和数组真的好像,但是vector的功能十分强大,在之后的章节中我们还将继续碰到。

Logo

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

更多推荐