vector类型是一个标准库中的类型,代表一个容器、集合或者动态数组这样一种概念。
既然是容器,那就可以把若干个对象放到里面。当然,这些对象的类型必须相同。
可以把一堆int型数字放到vector 容器中去
复杂点说,可以把一堆相同类型的类对象放到vector容器中去。
要想使用这种类型,需要在.cpp源文件开头包含vector头文件: std::vector
定义一个vector类型对象。显然,一旦定义出来,这个对象就是容器了。例如想在里面保存int型数据(容器里面所要装的元素类型)
“<>”里面是int,表示这个vector类型 的对象(容器)里面存放的是int型对象(int型数据/元素)
在后面章节中会讲到“类模板”的概念,其实vector就是一个类模板,这里的“<>”实际上是类模板的一个实例化过程。
换一种容易理解的方式:? ?
vector理解成一个残缺的类类型,光有类名vector还不够,还需要额外给vector类模板提供其要在其中保存什么类型数据的信息,这个信息就是通过<int>来提供
所以,在使用vector时,一定要在它后面跟一对 “<>”并在其中跟一个该vector容器中要保存的数据(元素)类型的信息,这才算一个完整的类型(完整的类类型)。
vector不是一个完整类型,而vector<int>却是一个完整的类型。
一般来讲,vector容器里面可以装很多种不同类型的数据作为其元素 (容器中装的内容简称“元素”)。
但是vector不能用来装引用。请记住,引用只是一个别名,不是一个对象。不是对象,不能忘vector里面放
可以往这个容器的末尾增加一些数据。
可以使用vector的 成员函数push_back往容器末尾增加数据。注意看它的下标[0],[1],[2],…不断增长
实验效果:
在vector对象元素类型相同的情况下,进行vector对象元素复制(新副本)。
在C++11中,还可以用初始化列表方法给初值,这个时候用 “{}”括起来。
当然“{}”里面为空也可以,那就相当于没有初始化,是一个空的 vector了。
请注意,有元素数量概念的初始化,用 的都是“()”
如果不给元素初值,那么元素的初值要根据元素类型而定,
“()”一般表示对象中元素数量这种概念, “{}”一般表示元素的内容。这种概念,但又不是绝对。
倒数第二个vector<int>i4{10,1}等同于初始化列表
结论就是:要想正常通过“{}”进行初始化,那么“{}”里面的值类型得跟 vector后边的“<>”里面的元素类型相同。否则,“{}”里面提供的值就无法作为元素初始值’
在使用vector时,最常见的情况是并不知道vector里会有多少个元素,使用时会根据需要动态地增加和减少。
一般来讲,使用者是先创建一个空的vector对象,然后通过代码向这个vector里增加或减少元素。vector上很多的操作和string很相似。
一个非常常用的方法,用于向vector末尾增加一个元素。
v[n]:返回v中的第n个字符(n是一个整型值),位置从0~.size()-1,如果下标引用超过这个范围,或者用下标访问一个空的vector,都会产生不可预测的结果(因为编译器可能发现不了这种错误)。
两个vector对象相等:元素数量相同,对应位置的元素值也都相同。 否则就是不相等。
和讲解string时对范围for的应用类似。
结果是 2 4 6 8 10;第二个for也可以用引用
如果在范围for中,增加改变vector容量的代码,则输出就会变得混乱
虽然有结果,但结果不可预测;
auto vecitem 每次循环相当于重新定这个变量
因为每次执行for循环,都会重新定义vecitem,并且把它的值初始化成vecvalue序列中的下一个值。
在刚刚进入这个for循环时,在系统内部 会记录序列结束的位置值(上面如5),但一旦在这个范围for里面改动这个序列的容量(如增加/删除元素),那么这个序列结束的位置值就肯定会发生改变,这个改变会导致for语句的混乱,其输出的值也就乱了。
结论:在for语句中,不要改变vector的容量,增 加、删除元素都不可以。
请读者千万千万不要写出这种错误代码,否则隐 患无穷,切记切记!