标准库类型vector
参考书籍:c++ primer
标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,索引用于访问对象。vector也常被称作容器。要想使用vector,必须包含适当的头文件,即#include<vector>
using std::vector
以vector为例,提供的额外信息是vector内所存放对象的类型:
例子:
vector<int> ivec; //ivec保存int类型的对象
vector<vector<string>> file; //该向量的元素是vector对象
定义和初始化vector对象
vector<T> v1 //v1是一个空vector,它潜在的元素是T元素的,执行默认初始化
vector<T> v2(v1) //v2中包含有v1所有元素的副本
vector<T> v2 = v1//等价于v2(v1),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...) //等价于v5(a,b,c...)
通常先定义一个空vector,然后当运行时获得到元素的值后逐一相加。
当然,也可以在在定义vector对象时指定元素的初始值。例如,允许把一个vector对象的元素拷贝给另外一个vector对象。此时,新vector对象的元素就是原vector对象对应元素的副本。注意:两个vector对象的类型必须相同。
vector<int> ivec;//初始化状态为空
//在此处给ivec添加一些值
vector<int > ivec2(ivec);//把ivec的元素拷贝给ivec2
vector<int> ivec3 = ievc;//把ivec的元素拷贝给ivec3
vector<string> svec(ievc3);//错误:svec的元素时string对象,不是int
列表初始化vector对象
如果提供的是初始元素值的列表,则只能把初始值都放在花括号里进行列表初始化,而不能放在圆括号里
vector<string> v1{"a","an","the"};//列表初始化
vector<string> v2("a","an","the");//错误
创建指定数量的元素
vector<int> ivec(10,-1);//10个int类型的元素,每个都被初始化为-1
vector<string> svec(10,"hi")//10个string类型的元素,每个都被初始化为"hi"
值初始化
通常情况下,可以只提供vector对象容纳的元素数量而忽略初始值
vector<int> ivec(10);//10个元素,每个都初始化为0
vector<string> svec(10);//10个元素,每个都是空的string对象
如果只提供了元素的数量而没有设定初始值,只能使用直接初始化:
vector<int> vi = 10;//错误:必须使用直接初始化的形式指定向量大小
在某些情况下,初始值的真实含义依赖于传递初始值时用的是花括号还是圆括号。
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
- 圆括号 用提供的值来构造对象。例如,v1的初始值说明了vector容量的值
- 花括号 可以表述成我们想列表初始化该vector对象。也就是说,初始化过程会尽可能地把花括号内的值当成是元素初始值的列表来处理,只有在无法执行列表初始化时才会考虑其他初始化方式。
另一方面,如果初始化时使用了花括号的形式,但是提供的值又不能用来初始化,就要考虑用这样的值来构造vector对象了。
vector<string> v5{"hi"}//列表初始化:v5有一个元素
vector<string> v6("hi")//错误:不能使用字符串字面值构建vector对象
vector<string> v7{10}//v7有10个默认初始化的元素
vector<string> v8{10,"hi"}//v8有10个值为"hi"的元素
尽管在上面的例子中除了第二条语句之外都用了花括号,但其实只有v5是列表初始化。要想列表初始化vector对象,花括号里的值必须与元素类型相同。显然不能用int类型初始化string对象,所以v7和v8提供的值不能作为元素的初始值。确认无法执行列表初始化后,编译器会尝试用默认值初始化vector对象。
向vector对象中添加元素
通常的情况下,创建一个vector对象时并不清楚实际所需的元素的个数,元素的值也通常无法确定。那么这个时候我i们就需要使用vector的成员函数push_back向其中添加元素。push_back负责把一个值当成vector对象的尾元素“压到”vector对象的“尾端”。例如:
vector<int> v2; //空vector对象
for(int i = 0;i != 100;++i)
v2.push_back(i); //依次把整数值放到v2尾端
//循环结束后v2有100个元素,值从0到99
有时需要需要实时读入数据然后将其赋予vector对象:
//从标准输入中读取单词,将其作为vector对象的元素存储
string word;
vector<string> tect; //空的vector对象
while(cin>>word)
text.push_back(word); //把word添加到tect后面
其他的一些vector操作
- v.empty()----------------如果v不含任何元素,返回真;否则返回假
- v.size()-------------------返回v中元素的个数
- v.push_back(t)---------向v的尾端添加一个值为t的元素
- v[n]------------------------返回v中第n个位置上元素的引用
- v1 = v2-------------------用v2中元素的拷贝替换v1中的元素
- v1 = {a,b,c…}----------用列表中元素的拷贝替换v1中元素
- v1 == v2-----------------v1和v2相等当且仅当它们的元素数量相同且对应位置的元素值都相同