(1)标准库类型vector表示对象的集合,其中所有的对象的类型都相同。集合中每个对象都有与之对应的索引号,索引用于访问对象。vector因为能容纳多个对象,所以又称为“容器”。
(2)想使用vector,必须包含相应的头文件:
#include<vector>
using std::vector;
(3)C++语言既有类模板又有函数模板。其中vector是一个类模板。模板本身不是类或者函数----类似显示生活中的模板,但是可以将模板看成作为编译器生成类或者函数的一部分,编译器根据模板创建类或者函数称为实例化。
(1)定义和初始化对象常用的方法:
vector<T> v1; // v1是一个空的vector对象,它潜在的元素类型为T类型,里面包含0个元素
vector<T> v2(v1);
vector<T> v3(n,val);
vector<T> v4(n);
vector<T> v5{a,b,c,d...};
建议:我们初始化最常见的方式就是先定义一个空vector,然后当运行时获取到元素的值进行逐一添加。
(2)列表初始值还是元素数量?
vector<int> v1(10); // v1 有10个元素,每个值为0
vector<int> v1{10}; // v1 有1个元素,值为10
vector<int> v1(10,1); // v1 有10个元素,每个值为1
vector<int> v1{10,1}; // v1 有2个元素,每个值为10,1
vector<string> v1{“hi”}; // 列表初始化,v1中有1个元素
vector<string> v1(“hi”); // 错误
vector<string> v1{10}; // 10为整型,与string类型不一致,所以v1中有10个默认初始化元素
vector<string> v1{10,“hi”}; // 有10个值为"hi”的元素
注意:要想列表初始化,花括号的值必须与元素的类型相同
(1)一般情况下,我们创建一个vector对象是并不清楚实际所需要的元素个数,元素的值我们也无法确定。处理方法就是:先创建一个空vector,然后运行时再利用vector的成员函数push_back向其中尾端添加元素。
(2) // 从标准输入中读取单词,将其作为vector对象的元素存储
string word;
vector<string> text;
while(cin>>word)
text.push_back(word); // 把word添加到text尾端
(3)如果循环体内部包含有向vector对象添加元素的语句,则不应该使用范围for循环,范围for循环不应改变所遍历序列的大小。
(1) v.empty() v.size() v.push_back(i); v[n]
= == != > >= < <= 大多数与string的相关操作类似
(2) vector对象的索引
使用下标运算符获取指定元素,下标从0开始
举个例子,输入成绩,取值0--100,以10分为一个分数段,统计分数段各有多少个成绩?
如输入 42 65 95 100 39 67 95 76 88 76 83 92 76 93
输出 0 0 0 1 1 0 2 3 2 4 1
// 以10分为一个分数段统计成绩数量:0--9,10--19,20--29...90--99,100
vector<unsigned> scored(11,0); // 11个分数段,全部初始化为0
unsigned grade;
while(cin>>grade) { // 读取成绩
if(grade<=100) // 只处理有效成绩
++scores[grade/10];
}
(3) 不能用下表形式添加元素,正确方法是使用push_back函数
只能对确知已存在的元素执行下标运算,否则可能导致缓冲区溢出,编译器无法查这类错误