1. vector基础介绍
需要添加头文件
- #include<vector>
- 添加命名空间 using std::vector
vector是什么
- 是一个集合
- 是一个容器
- 就是用来存放对象的集合/容器,而且每个对象的类型是一样的
- 比如可以存放int类型对象,就不让你不能装string类型对象
vector如何申明
- 通过在vector后面添加尖括号,尖括号里面是要存储元素的类型,后面就是其变量名称
- vetctor<int> ivec
- vector<string> svec
- vector<class_Teacher> class_vec
- vector<vector<string>> file
vector 可以存放什么类型的对象
- 可以用来容纳绝大多数作为元素
- 注意不能存放引用类型,因为引用不是对象
- 当然vector也可以容纳vector自己对象
- 例如: vector<vector<int>>
- 老版本的写法是 vector<vector<int> >最后一个尖括号,多加一个空格
vector 为什么可以存放绝大多数对象作为元素
- 使用了类模板,简单点说,就是类中使用一种通用类型作为其数据成员类型或者成员函数
- 具体使用的时候需要指定其类型,比如vector使用的时需要用尖括号指定其类型
- 当一定一个vector<int> 类型的时候,
- 编译器会根据用户指定的int类型来替换类中使用的通用类型
- 编译器根据模板创建类或函数的过程称为实例化
2. vector对象的定义和初始化
初始化vector对象的主要方法如下表
默认初始化和拷贝初始化
- 默认初始化 例如vector<string> svec;
- svec不包含任何元素,空vector
- 拷贝初始化 ,直接将某个vector 复制给定义的新的vector, 注意其元素类型必须一样
- vector<int> ivec;
- vector<int>ivec2(ivec);
- vector<int>ivec3 = ivec;
- vector<string> svec(ivec2) ; erro, 元素的类型不一样
- svec不包含任何元素,空vector
- vector<int> ivec;
- vector<int>ivec2(ivec);
- vector<int>ivec3 = ivec;
- vector<string> svec(ivec2) ; erro, 元素的类型不一样
列表初始化
- 用花括号括起来0个或者多个初始元素赋值为vector对象
- vector<string> mygoal = {"To","be","number1"};
- vector<string> mygoal {"To","be","number1"};
- 几种初始化总结
- 使用拷贝初始化(=),一般只能提供一个初始值
- 使用类内初始化 ,只能使用拷贝初始化或者花括号的形式
- 列表初始化,只能把初始化值放在花括号里,不能放在圆括号里
值初始化
- 对于vector而言,指定vector对象容纳元素的数量而不考虑其初始值,这叫做值初始化
- vector<int> ivec(10);
- vector<string>svec(10);
- 两个特殊限制
- 有些类要求必须提供初始值,就无法实现值初始化
- 比如vector元素的类型不支持默认初始化时
- 不能使用等号=操作符,只能使用直接初始化,使用括号()操作符
- vector<int> iv = 10 error
- 有些类要求必须提供初始值,就无法实现值初始化
创建指定数量的元素
- 指定数量是指指定vector对象容乃的元素数量和所有元素的统一初始值
- vector<int> ivec(10,100);
以上三种初始化的区别
- 本质上是理解花括号和圆括号
- vector<int> v1(10)
- vector<int> v2{10}
- vector<int> v3(10,1)
- vector<int> v4{10,1}
- 理解圆括号的本质
- 本质是利用了vector对象的构造函数来初始化
- 花括号的本质
- 编译器会尽可能把花括号量的值当成列表初始化来处理
- 如果编译器无法使用列表初始化的时候,编译器会自动的将其转成()构造函数来初始化
实例练习:
- 默认初始化和拷贝初始化
- 列表初始化实例,圆括号
- 值初始化的两个限制条件使用
- 对比三种初始化
//1 默认初始化一个空的vector;
vector<int> v1;
// 拷贝初始化,v2中包含所有v1的元素
vector<int> v2(v1);
vector<int> v3 = v1;
//vector<string> v4(v1); //err 注意vector只能存放相同类型的元素
//2 列表初始化,使用大括号用逗号分开元素
vector<string> mygoal = { "Try", "my", "best" };
//vector<string> mygoal{ "Try", "my", "best" };
//3 指定数量初始化
vector<int> v4(10, 100); //表示vector的数量是10,初始值为100
//这种情况要注意保证该元素的类型支持默认初始化,不能使用等号操作
vector<int> v5(10); //表示vector的数量是10,初始值为0
//vector<int> v5 = 10; //err 不能使用=操作符来赋值
//4 理解圆括号和大括号的区别
vector<int> v6(10); //表示vector存在这样构造函数,支持这样初始
vector<int> v7(10, 1);
vector<int> v8{ 10 }; //编译器首先使用表初始化来处理
vector<string> v9{ 10, "hi" }; //编译器无法使用列表初始化来,会自动转换成()来处理
//vector<string> v9(10, "hi");
3. vector添加元素
- 直接初始化而不需要额外添加元素的情况
- 初始值已知且数量少
- 用另外的对象副本来初始化
- 所有元素的初始化值一样
使用push_back 添加元素
- 将元素push到vector对象的尾部
- 使用循环来添加元素for,while
- 尽量不要在定义vector的时候设定其大小
- 注意点
- 保证循环正确无误
- for中有改变其序列大小的时候,尤其要注意
实例练习:
- 添加从1-99
- cin输入来添加vector<string>
- 实例for 中改变其序列大小的情况 详见5.4.3
// 1 添加 0 - 99
vector<int> ivec;
for (int i = 0; i < 100; i++)
{
ivec.push_back(i);
}
for (size_t i = 0; i < ivec.size(); i++)
{
cout << ivec[i] << endl;
}
//2 cin输入来添加vector<string>
vector<string> svec;
string tmp;
while (cin>>tmp)
{
svec.push_back(tmp);
}