STL中序列容器之Vector

一、STL组件

程序的主要目标是管理数据和产生结果,然而获得这样的目标需要把数据存储到计算机内存中、访问指定的数据,以及写算法来管理数据等能力。


例如,若我们要操作的所有数据是同类型的,且知道数据的数目, 那么我们可以使用数组来存储数据。此时,我们可以使用索引来访问数组特定的组件。利用循环和数组索引,我们可以遍历数组元素。算法,像初始化数组,排序,搜索,用来管理数组中存储的数据。


若我们不知道数据的数目,那么我们可以使用链表(Linked List)来处理。若数据需要以后进先出(LIFO)方式进行处理,那么我们可以使用栈(Stack)。相似的,若数据需要以先进先出(FIFO)方式来进行处理,那么我们可以使用队列(Queue)。


STL就是具有这些特性来有效的管理数据。更加正式的说,STL具有如下三个主要组件:

  • 容器(Containers)
  • 迭代器(Iterators)
  • 算法(Algorithms)
容器和迭代器是类模版。迭代器用来遍历容器中的元素。算法用来管理数据。如下从细节处来对各个组件进行学习

二、容器类型
容器用来管理给定类型的对象。STL容器分为三类:
  • 序列容器(也称为顺序容器)——Sequence containers(also called sequential containers)
  • 关联容器——Associative containers
  • 容器适配器——Container adapters
1、序列容器
在序列容器中每个对象有一个指定的位置。三个预定义的序列容器是:
  • vector
  • deque
  • list

vector容器类似与数组,因此其可以像数组一样处理。同时,通过vector容器的学习,我们可以描述所有容器共有的一些属性。实际上,对于共有的操作,所有的容器使用相同的名字。当然,对于某一容器,其有特定的操作。关于特定的操作,当描述特定的容器时再进行讨论。

三、 序列容器:vector
vector容器以动态数组的方法来存储和管理对象。因为数组是一种随机访问的数据结构,因此,vector中的元素可以随机的访问。数组中在数组的中间或开头位置进行插入操作时是需要消耗时间,尤其在数组非常大的情况下。然而,在尾部插入一些元素非常的快。

实现vector容器的类名为vector,包含类vector的头文件是<vector>,因此,若在程序中使用vector容器,程序必须包含如下的语句:
#include <vector>

另外,定义vector变量时,需要指定其对象的类型。因为类vector是类模版,例如:
vector<int> intList;
声明了intList为一个vector变量,组件类型为int。类似的,如下语句:
vector<string> stringList;

声明了stringList是一个vector容器,组件类型是string。


声明vector对象
类vector容器包含好几个构造器,包括缺省构造器。因此,vector容器可以以好几种方式进行声明和初始化。下表描述了特定类型的vector容器时如何进行声明和初始化的。


管理vector中的数据

如何对存储在vector容器中的数据进行管理呢?为了管理vector容器中的数据,我们必须要知道如下的操作:

  • 元素插入
  • 元素删除
  • 遍历vector容器中元素
vector容器中的元素可以使用下表中给定的操作直接进行访问。

从上表中可知,vector容器中元素的处理类似于数组。
举例:
#include <iostream>
#include <vector>

using namespace std;

int main()
{
	//声明一个大小为5的vector容器intList
	vector<int> intList(5);

	//通过循环存储元素到intList中
	for(int i = 0; i < 5; i++)
	{
		intList[i] = i;
	}

	//通过循环输出intList中的元素
	for(int i = 0; i < 5; i++)
	{
		cout << intList[i] << endl;
	}

	return 0;
}

类vector同时也包含成员函数用来查看当前容器中元素数目,以及最大可以插入到容器的元素数目等。下表描述了一些操作。


类vector中也包含除了插入和删除操作外的其他成员函数用来管理数据,假设vecList是一个vector容器,vecList的元素的插入和删除操作可以通过下表中的操作来完成。这些操作通过作为类vector的成员函数来实现。

上表中,标识符position,beg和end在STL术语中称为迭代器,迭代器就像一个指针一样,通过,迭代器用来遍历容器中的元素。也就是说,通过迭代器,我们可以遍历和处理容器中的元素每次一个。如下实例展示了如何使用push_back():

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	//声明一个vector容器intList
	vector<int> intList;

	//通过push_back()存储元素到intList中
	intList.push_back(34);
	intList.push_back(55);

	//通过循环输出intList中的元素
	for(int i = 0; i < intList.size(); i++)
	{
		cout << intList[i] << endl;
	}

	return 0;
}

声明vector容器的迭代器

类vector包含定义的interator(typedef interator),其声明为public成员,vector容器的interator使用typedef interator来进行声明,例如:

vector<int>::interator intVecIter;

声明了一个类型为int的vector容器的interator为intVecIter。


由于interator是类vector内部的一个typedef定义的。因此,我们必须使用容器名(vector),容器元素类型和范围解析操作符来使用typedef迭代器。

表达式++intVecIter让intVecIter指向容器下一个元素,表示*intVecIter返回当前迭代器位置的元素。

从这些操作,我们可知这些操作和指针的操作一样。


如下讨论如何使用vector容器中的迭代器老管理存储在vector容器中的数据。

假设有如下表达式:

vector<int> intList;
vector<int>::iterator intVecIter;
第一行声明一个vector容器的intList变量,元素类型为int。

第二行声明了vector容器中的迭代器intVecIter。


容器和函数begin与end

每个容器都有成员函数begin和end,函数begin()返回容器中第一个元素的位置。函数end()返回容器中最后一个元素的位置,同时这些函数没有参数,

执行如下语句:

intVecIter = intList.begin();

这样迭代器intVecIter指向了容器intList中的第一个元素。如下for循环输出intList中的元素

	//通过interator输出intList中的元素
	for(intVecIter = intList.begin(); intVecIter != intList.end(); ++intVecIter)
	{
		cout << *intVecIter << " ";
	}
下例展示了vector中insert函数的使用

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	int intArray[7] = {1, 3, 5, 7, 9, 11, 13};

	//声明一个vector容器intList
	vector<int> intList(intArray, intArray + 7);
	vector<int>::iterator intVecIter;

	intVecIter = intList.begin();
	++intVecIter;
	intList.insert(intVecIter, 22);

	//通过interator输出intList中的元素
	for(intVecIter = intList.begin(); intVecIter != intList.end(); ++intVecIter)
	{
		cout << *intVecIter << " ";
	}

	return 0;
}

intVecIter首先初始化为intList的第一个元素,然后++intVecIter让其指向第二个元素,接着通过insert函数操作在intVecIter指定的位置插入22。这样,intList = {1, 22, 3, 5, 7, 9, 11,13}。注意,此时容器的大小也增加了。


如下示例展示了如何在一个在程序中使用vector容器,以及如何处理vector容器中的元素

#include <iostream>
#include <vector>

using namespace std;

int main()
{

	//声明一个vector容器intList
	vector<int> intList;

	intList.push_back(13);
	intList.push_back(75);
	intList.push_back(28);
	intList.push_back(35);

	cout << "List Elements:";
	for(int i = 0; i < 4; i++)
	{
		cout << intList[i] << " ";
	}
	cout << endl;

	for(int i = 0; i < 4; i++)
	{
		intList[i] *=2;
	}

	cout << "Now, List Elements:";
	for(int i = 0; i < 4; i++)
	{
		cout << intList[i] << " ";
	}
	cout << endl;

	vector<int>::iterator intVecIter;

	cout << "Through Iterator, List Elements:";

	//通过interator输出intList中的元素
	for(intVecIter = intList.begin(); intVecIter != intList.end(); ++intVecIter)
	{
		cout << *intVecIter << " ";
	}
	cout << endl;

	intVecIter = intList.begin();
	++intVecIter;
	++intVecIter;
	intList.insert(intVecIter, 88);

	cout << "Now, Through Iterator, List Elements:";

	//通过interator输出intList中的元素
	for(intVecIter = intList.begin(); intVecIter != intList.end(); ++intVecIter)
	{
		cout << *intVecIter << " ";
	}
	cout << endl;

	return 0;
}
输出为:



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值