一、vector类型是什么
在C语言中,我们可以通过数组定义普通类型数据或自定义类型数据的集合。数组的缺点很明显,程序员必须提前规定数组的大小,这可能导致两种结果:长度太小导致不够用,或者长度太大导致空间浪费。如果要实现可以动态增长的数组,我们就需要使用一些数据结构方面的知识,如链表。
C++标准库提供了vector类型,通过vector类型,我们可以很方便的定义大小可以动态改变的数据集合。
二、vector类型的使用
1. 定义vector对象
vector<int> v1; //定义vector类型的对象v1,v1默认为空,保存int类型元素
vector<int> v2(v1); //定义vector类型的对象v2,用v1来初始化
vector<int> v3(3); //v3保存了3个值为0的int元素
vector<string> v4(3); //v4保存了3个值为空的string元素
vector<T> v5(n,i); //v5保存了n个值为i的元素
2. 操作vector对象
vector对象的简单使用如下:
v.push_back(t) 在v末尾添加t
v.pop_back() 删除v末尾的元素
v[n] 返回v中n处的元素
#include <iostream>
#include <vector>
using namespace std;
//using std::vector;
int main(void)
{
vector<int> myVector;
//动态添加元素
for (vector<int>::size_type i = 0; i != 3 ;i++)
{
myVector.push_back(i);
}
//下标操作
for (vector<int>::size_type i = 0; i != myVector.size();i++)
{
cout<<myVector[i]<<endl;
}
myVector.pop_back();
cout<<endl<<"After pop_back():"<<endl;
for (vector<int>::size_type i = 0; i != myVector.size();i++)
{
cout<<myVector[i]<<endl;
}
}
三、使用iterator访问vector的元素
1、iterator类型
对vector的元素进行访问除了使用下标外,还可以使用iterator(迭代器)类型。iterator基本用法如下:
vector<int>::iterator myIter; //定义iterator类型变量
myIter = myVector.begin(); //myIter指向myVector第一个元素
cout<<*myIter<<endl; //解引用操作
myIter++; //myIter指向myVector第二个元素
myIter = myVector.end(); //myIter指向myVector最后一个元素的下一个
cout<<*myIter<<endl; //解引用操作会出现运行时错误
2、使用iterator访问vector元素
在上面的程序末尾添加如下几行,运行结果如下。可以发现,使用inser()向vector插入元素时,元素插入在了迭代器指向元素的位置,而插入之前的元素顺序后移。
vector<int>::iterator myIter;
myIter = myVector.begin();
//插入元素
myVector.insert(myIter,5);
cout<<endl<<"Afer Insert:"<<endl;
for (vector<int>::iterator it = myVector.begin();
it != myVector.end();
it++)
{
cout<<*it<<endl;
}
3、const_iterator和const iterator
vector<int>::const_iterator myIter;
const vector<int>::iterator myIter;
这两者有什么区别呢?const_iterator定义的迭代器不能改变它所指向元素的值,而迭代器自身可以改变,即可以指向不同的元素;而const iterator用来定义常量迭代器,它自身不能改变,即只能指向一个元素,而迭代器指向元素的值可以改变。
vector<int>::const_iterator myConstIter1;
myConstIter1 = myVector.begin();
myConstIter1++; //正确,可以指向不同的元素
*myConstIter1 = 1; //错误,指向的元素的值不能改变
const vector<int>::iterator myConstIter2 = myVector.begin();
*myConstIter2 = 1; //正确,指向的元素的值可以改变
myConstIter2++; //错误,只能指向固定的元素