标准库类型vector表示对象的合集,其中所有对象的类型都相同
需要包含头文件
#include<vector>
using std::vector;
c++语言既有类模板(class template),也有函数模板
vector是一个类模板
可将模板看成编译器生成类或函数编写的一份说明
编译器根据模板创建类或函数的过程称为 实例化(instantiation)
对于类模板来说,通过提供一些额外信息来指定模板到底实例化成什么样的类,需要提供那些信息由模板决定。
提供信息方式: 在模板名字后面跟一对尖括号,在括号内放上信息。
vector <int> ivec; //ivec保存int类型的对象
vector<Sales_item> Sales_vec; //保存Sales_item类型的对象
vector<vector<string>> file; // 该向量的元素是vector对象
Note:vector是模板而非类型,由vector生成的类型必须包含vector中元素的类型,例如vector<int>
vector不能包含引用(引用不是对象)
Warning: 老式声明语句来处理vector的vector元素对象,要在外层vector右侧的尖括号前加一个空格
3.3.1 定义和初始化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,d...} | v5包含了初始值个数的元素,每个元素被赋予相应的初始值 |
vector<T> v5={a,b,c,d...} | 同上 |
拷贝时两个vector对象的类型需相同
列表初始化 vector对象
用拷贝初始化或用花括号
创建指定数量的元素
见表
值初始化
第5行
会被初始化为0
如果是元素中的类型不支持默认初始化,就必须提供初始值
列表初始化还是元素数量?
{}和()的区别
3.3.2 向vector对象中添加元素
用 vector成员函数 push_back 向其中添加元素。
push_back负责把一个值当成vector对象的为元素 push 到vector的 back
string word;
vector<string> text; //空vector对象
while(cin >> word){
text.push_back(word);//把word添加到text后面
}
关键概念:vector对象能高效增长
开始时创建空的vector,运行时再动态添加元素
向vector对象添加元素蕴含的编程假定
如果循环体内部包含有向vector对象添加元素的语句,则不能使用 范围for循环
warning:范围for语句体内不应改变其所遍历序列的大小。
3.3.3 其他vector操作
v.empty() | 如果v不含有任何元素,返回真;否则返回false |
v.size() | 返回v中元素的个数 |
v.push_back(t) | 末尾添加t |
v[n] | 返回v中第n个位置上的引用 |
v1 =v2 |
|
v1 ={a,b,c...} |
|
v1==v2,v1!=v2 | 元素相同且对应位置的元素值相同 |
<,>,<=,>= | 以字典顺序进行比较 |
|
|
vector<int> v{1,2,3,4,5,6,7,8,9};
for(auto &I : v)
I *= I;
for(auto I : v)
cout << I << "";
cout << endl;
Note : 要用size_type 需首先看它是由哪种类型定义的。
vector<int>::size_type //正确
vector::size_type //错
有些不能比较 如两个vector<Sales_item>对象
其他和string差不多
计算vector内对象的索引
使用下标运算符,和string一样,vector的下标也是从0开始计起,
下标的类型是相应的 size_type 类型
输入:
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
两整数相除结果还是整数,余数被忽略
vector<unsigned>scores(11,0);
unsigned grade;
while(cin>> grade){
if(grade<=100)
++score[grade/10];
}
不能用下标形式添加元素
vector<int> ivec; //空vector对象
for(decltype(ivec.size()) ix =0; ix!=10;++ix)
ivec[ix] =ix; //严重错误:ivec不包含任何元素
ivec.push_back(ix); //正确
warning:vector和string下标运算符可用于访问已存在的元素,而不能用于添加元素
访问不存在会 缓冲区溢出(buffer overflow)