1、标准库vector类型
vector是同一种类型的对象的集合,称为容器,一个容器中的所有对象必须是同一种类型。使用vector之前,必须包含相应的头文件。
#include<vector> using std::vector;
必须说明vector保存何种类型的对象。
vector<int> ivec; //类型为vector<int>,该类型包含若干个int对象
vector不是数据类型,vector<int>和vector<string>等才是数据类型。
vector对象的定义和初始化
vector<T> v1; vector保存类型为T的对象,默认构造函数,v1为空
vector<T> v2(v1); v2是v1的副本
vector<T> v3(n,i); v3包含n个值为i的元素
vector<T> v4(n); v4含有初始化的元素的n个副本
vector对象的重要属性在于可以在运行时高效地添加元素。当元素值已知时,最好是通过动态地向它添加元素来让它增长。
虽然可以对给定元素个数的vector对象预先分配内存,但更有效的方法是先初始化一个空的vector对象,然后再动态的增加元素。
vector对象的操作
V.empty(); 如果V为空返回true,否则返回false
V.size(); 返回V中元素个数
V.push_back(t); 在V的末尾增加一个 值为t的元素
V[n]; 返回V中位置为n的元素
V1=v2 V1是v2 的副本
V1==v2 如果V1与v2 相等,则返回true
!=,<,<=,>,>= 惯有含义
vector对象的size
size返回相应vector类定义的size_type的值
vector<int>::size_type ix; //ok vector::size_type ix; // error
向vector添加元素
push_back()操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面。
string word; vector<string> text; while(cin>>word) { text.push_back(word); }
vector的下标操作
vector<int> ivec; //类型为vector<int>,ivec为空 for(vector<int>::size_type ix=0;ix!=ivec.size();++ix) { ivec[ix]=0; }
ivec为空,for循环一次也不执行。
下标操作不能添加元素
2、迭代器简介
vector<int> ivec; //ivec为空 for(vector<int>::size_type ix=0;ix!=10;++ix) { ivec[ix]=ix; //错误 }
上述程序试图在ivec中插入10个新元素,0到9,但是ivec为空,下标只能用于获取已经存在的元素。
正确写法是:
vector<int> ivec; //ivec为空 for(vector<int>::size_type ix=0;ix!=10;++ix) { ivec.push_back(ix); //正确 }
迭代器(iterator)是一种检查容器内元素并遍历元素的数据类型。
迭代器提供了比下标更通用的方法:所有的标准库容器都定义了相应的迭代器,而只有少数容器支持下标操作。
vector<int>::iterator iter;
begin和end操作
每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。由begin返回的迭代器指向第一个元素,由end返回的迭代器指向vector的“末端元素的下一个”。通常称为超出末端迭代器,标明它指向一个不存在的元素。
vector<int> ivec; //ivec为空 vector<int>::iterator iter=ivec.begin();
迭代器可以使用解引用操作符(*操作符)来访问迭代器所指向的元素:iter指向ivec的第一个元素,那么*iter和ivec[0]指向同一个元素。
迭代器使用自增操作指向容器中下一个元素。由于end返回的迭代器不指向任何元素,所以不能对它进行解引用和自增操作。
vector<int> ivec; //ivec为空 for(vector<int>::size_type ix=0;ix!=ivec.size();++ix) { ivec[ix]=0; //正确 }
和
vector<int> ivec; //ivec为空 for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter) { *iter=0; }
以上两个程序实现相同功能。
const_iterator
每种容器都定义了一种const_iterator类型,该类型只用于读取容器内元素,不可以改变其值。
for(vector<int>::const_iterator iter=ivec.begin();iter!=ivec.end();++iter) { cout<<*iter<<endl; }