3.3标准库类型vector

标准库类型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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值