一. Vector类型简介
- C++标准库:是类库和函数的集合,其使用核心语言写成,由
C++
标准委员会制定,并不断维护更新。 - Vector类型:
C++
标准库中的一员,它是能把其他对象装进来的一个集合或者动态数组,也被称为容器。
二. 定义和初始化Vector类型简介
1、 使用Vector
类型前要:
#include <vector> using namespace std; //不包含该命名空间的话,需要使用std::vector声明
2、 定义和初始化Vector
对象:
格式:vector<数据类型> 对象名;
——数据类型可以是整型int
、字符类型string
、点集point
、结构类型struct
等。
初始化方式:
① 空vector初始化,并向容器中存入数据——push_back
(常用)
vector<string> str; //创建一个string类型的空的vector对象(容器) str.push_back("abc"); str.push_back("def");
可以看到str
容器中存入了上面的两组数据:
② 元素拷贝初始化
vector<string> str2(str); //把str元素拷贝给str2 vector<string> str3 = str; //把str元素拷贝给str2,两者等价
③ {}
列表方式初始化 —— C++11中的标准。Ps:一般用大括号表示对象中元素内容这么个概念
vector<string> str4 = {"aaa", "bbb", "ccc"} //创建包含3个string类型的元素数组,分别是"aaa", "bbb", "ccc" vector<int> num{10,20}; //创建包含2个int类型的元素数组,分别是10,20 vector<int> num2{10}; //创建包含1个int类型的元素数组,值为10
④ 创建指定数量的元素初始化(不常用,理解即可)。Ps:一般用圆括号表示对象中元素数量这么个概念
vector<string> str5(5,"Hi"); //创建包含5个string类型的元素数组,每个元素的值是Hi vector<int> num3(10,10); //创建包含10个int类型的元素数组,每个元素的值是20; vector<int> num4(10); //创建包含10个int类型的元素数组,每个元素值是缺省的0;
三. Vector对象的操作
在Vector
容器的使用中,常用逻辑是先创建一个空的Vector
对象(上面的第一种初始化方式),然后往这个容器中动态增加/减少元素。
① .empty()
—— 判断容器是否为空,返回值为bool
类型
vector<int> num; if(num.empty()) { qDebug() << "num为空"; }
② .push_back()
—— 向vector
中的末尾增加一个元素
vector<int> num2; for(int i =1; i<=100; i++) { num2.push_back(i); //向容器num2中分别存入1...100元素,下面的例子都以该容器中值为例 }
③ .size()
—— 返回元素的个数
qDebug() << "num2中的元素个数" << num2.size(); //值为100
④ .clear()
—— 清空容器中的元素
num2.clear(); qDebug() << "num2中的元素个数" << num2.size(); //num2中元素个数清空变为0
⑤ num2[n]
—— 返回容器num2
中的第n
个元素,下标从0
开始,num2.size()-1
结束
int value = num2[0]; //value值为1 int value1 = num2[1]; //value1值为2
⑥ auto
—— 范围for
在vector
中的应用(auto
后面跟&
)(常用)
vector<int> num3 vector<int> num4{ 1,2,3,4 }; for(auto &temp : num4) //保持习惯,尽量使用引用&,相比较于赋值效率更高 { num3.push_back(temp); //遍历容器num4中的每个数据,依次存入容器num3中 } //若要修改容器中的数据,也一定要用引用&+范围for语句的形式 for(auto &temp1 : num4) { temp1 *= 2; num3.push_back(temp1); //遍历容器num4中的每个数据,*2后依次存入容器num3中,结果为2,4,6,8四组数据 }
四. 范围for进一步讲解
1、假设我本意是输出容器中的所有值
vector<int> num4{ 1,2,3,4 }; for(auto temp2 : num4) { qDebug() << temp2; }
2、但是若在范围for语句中又对正在遍历的容器中插入了其他元素,导致遍历的值发生改变,比如:
for(auto temp2 : num4) { num4.push_back(88); qDebug() << temp2; }
这会导致编译器运行时轻则输出元素值错乱,重则直接崩溃:Expression: vector iterator not incrementable
(向量迭代器不可递增)。
崩溃原因:
在第一次执行范围for语句时,系统会先记录遍历的容器结束的位置值,比如上面容器num4
中,结束的位置值就是4
,在for
循环过程中一旦遍历到这个结束值4
,系统会认为遍历结束并自动退出for
循环。
那么我们在for
循环遍历容器的过程中,一旦中途对这个容器中的值进行增/减操作,比如屁股上插个值或删除了里面的某个元素,会导致容器的中结束位置发生了改变,那么for
循环输出的值就会发生错乱或系统崩溃。
结论:
在for
循环语句中(遍历一个容器等类似操作中),千万不要改动vector
容器的容量,包括对容器进行增加/删除等操作都不可以。
下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |