vector是一个类模板,模板本身不是函数或类,相反可以将模板看做编译器生成类或函数编写的一份说明。编译器根据模板创建类或函数的过程称为实例化
要使用vector,必须包含适当的头文件,后续都假定做了如下声明:
#include<vector>
using std::vector;
1.定义和初始化vector对象
vector能容纳绝大多数的类型的对象作为其元素,但因为引用不是对象,所以不包含引用的vector
初始化vector对象的方法:
vector<T> v1; //v1是一个空vector,他的潜在元素是T类型的,执行默认初始化
vector<T> v2(v1); //v2中包含有v1所有元素的副本
vector<T> v2=v1; //等价于上行
vector<T> v3(n, val); //v3包含n个重复的元素,每个元素值都是val
vector<T> v4(n); //v4包含了n个重复地执行了值初始化的对象
vector<T> v5{a,b,c...}; //v5包含了初始值个数的元素,每个元素被赋予相应的初始值
vector<T> v5={a,b,c...}; //等价于上行
注意:如果使用的是圆括号,可以说提供的值是用来构造vector对象的;如果使用的是花括号,可以表述丞我们想列表初始化该vector对象。eg如下:
vector<int> v1(10); //v1有10个元素,每个元素都是0
vector<int> v2{10}; //v2有1个元素,该元素的值是10
vector<int> v3(10,1); //v3有10个元素,每个值都是1
vector<int> v4{10,1}; //v4有2个元素,值分别是10和1
对vector对象来说,直接初始化的方式适用于三种情况:1、初始值已知且数量较少2、初始值是创建另一个vector对象的副本3、所有元素的初始值都一样
2.向vector对象中添加元素
添加元素处理方法:先创建一个空的vector,在运行时利用vector的成员函数push_back向其中添加元素。push_back负责把一个值当成是vector对象的尾元素压入尾端。
vector<int> v2;
for(int i = 0; i != 100; ++i)
v2.push_back(i);
//循环结束后v2有100个元素,值从0到99
string word;
vector<string> text;
while(cin >> word){
text.push_back(word);
}
//实时读入数据然后将其赋予vector对象
注意:如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环【目前我也不知道为啥,书里说以后解释】
3.其他vector操作
v.empty(); //如果v中不含任何元素,返回真;反之返回假
v.size(); //返回v中元素的个数
v.push_back(t); //向v的尾端添加一个值为t的元素
v[n]; //返回v中第n个位置上元素的引用
访问vector对象中元素的方法与string类似,例如,可以使用范围for语句处理vector对象中的所有元素。
vector<int> v{1,2,3,4,5,6,7,8,9}
for(auto &i : v) //对于v中每个元素(i是引用,这样能通过i给v的元素赋值)
i *= i; //等价于i=i*i求该元素的平方
for(auto i : v)
cout << i << " "; //输出该元素
cout << endl;
计算vector内对象的索引,例如,以10分为一个分数段统计成绩的数量:0~9,10~99,...,90~99,100。
vector<unsigned> scores(11,0); //11个分段初始化为0
unsigned grade;
while(cin >> grade){
if(grade <= 100) //只处理有效的成绩
++scores[grade/10]; //对应分段+1;等价于auto ind = grade/10; scores[ind] = scores[ind] + 1;
}
注意,不能用下标形式添加元素。
//错误实例
vector<int> ivec;
for(decltype(ivec.size()) ix=0; ix != 10; ++ix)
ivec[ix] = ix; //严重错误:ivec不包含任何元素
//正确实例,应改为
ivec.push_back(ix);
但是vector对象的下标可以用于访问已存在的元素,但是注意只能访问已存在元素,若通过下标访问不存在的元素会产生缓冲区错误!