今天我们先来了解一个简单的容器vector,这个容器和数组类似,是用来存放相同数据类型的类模板,大家注意vector是类模板不是类型,我们需要在它后面跟上一对尖括号写上我们要存放的数据类型,这样才构成了一种数据类型,比如vector<int>这个就是一种数据类型,在vector容器中存放的是整形的数据。还有一个比较重要的东西就是迭代器,这个东西是用来从容器中访问元素的。下面通过代码来看看如何使用吧。

#include <iostream>
#include <vector> //使用vector必须包含头文件vector
#include <string>

using namespace std;

int main()
{
	//vector不是一种数据类型,它是类模板,而vector<int>等等才是数据类型
	vector<int> int_vector(10,0); //初始化包含10int类型的vector<int>对象,它们的初值都是0
	vector<string> string_vector(20,"www.zaojiahua.com"); //包含20个string类型的vector对象,初值是www.zaojiahua.com
	vector<float> float_vector(); //包含0个元素
	//包含2个元素,每个元素的初值是0,基本数据类型没写初值的话都是0,如果是类类型的话,就会使用类的默认构造函数
	//进行初始化,请注意是默认的构造函数,如果没有定义任何的构造函数的话,会对对象的每个成员再进行初始化
	vector<double> double_vector(2);

	string word;

	vector<string> str2_vector;
	//向vector中添加元素
	while(cin>>word)
	{
		//使用push_back构造函数向vector容器中添加元素
		str2_vector.push_back(word);
	}
	//vector<int>::size_type;
	int i = 0;
	//使用下标遍历vector中的元素
	for(;i<str2_vector.size();i++)
	{
		//通过str2_vector的下标取得里边的内容,但是不可以通过下标向不存在元素的位置添加元素
		//str2_vector[i] = "hello";这样做是可以的,因为i对应的位置都是存在元素的,但是像for循环外的注释代码就不行了
		cout<<str2_vector[i]<<endl;
	}
	/*str2_vector[i] = "hello";
	cout<<str2_vector[i];*/

	//使用迭代器来访问vector中的元素
	//迭代器就应该使用以下的这种方式进行初始化,begin函数会返回容器的一个迭代器,这个迭代器指向了容器
	//中的第一个元素,而end函数返回的是容器中的最后一个元素的下一个元素,当容器中没有元素的时候,begin
	//和end的返回值是相同的
	//const_iterator大家把它理解为指向const类型的指针就可以了,也就是说他所指向的元素的值是不可以被改变的
	vector<string>::const_iterator iter = str2_vector.begin();
	for(;iter != str2_vector.end();iter++)
	{
		//访问迭代器中的元素可以使用解引用操作符,要让迭代器指向下一个元素可以使用++操作符
		cout<<*iter<<endl;
	}
	return 0;
}

大家看了上边的方法以后是不是觉得数组和vector很类似啊,确实如此啊。那么我们改如何选择呢,我的理解是数组的大小是需要事先分配的,而vector是动态增长的,如果你不知道你要多少元素当然是vector比较合适的了。但是数组在访问元素的时候效率是比较高的,vector的计算开销比较大。如果你要时常的改变元素的值,还是用vector比较好。vector为我们提供了很多很多的方法,就是一些常用的算法供我们使用,这个在我们做数据结构和算法的时候用它就比较好了,省的我们去写。关于他们的优缺点请自行查资料吧。还有就是对容器中内容的访问,我们可以使用下标,但是并不是所有的容器都是支持下标的,但是所有的容器都是支持迭代器的,所以使用迭代器来访问元素是经常的做法。