c++知识细节-c++标准库-vertor类型
简介
集合或动态数组,可以将若干对象装在里面.也被称为容器.
#include <vector>
using namespace std;
vector<int> vjihe; //表示vjihe里面存放的是int型数据(int型对象)
//<int>:模板,vector本身就是一个类模板,<int>实际上是类模板实例化的过程,可以理解成vector是一个残缺的类类型
- 不能往vector里装引用,因为引用仅仅是个别名,并不是对象
定义和初始化vector对象
- 空vector
vector<string> mystr;
mystr.push_back("abc");
mystr.push_back("def");
- 元素拷贝的初始化方式
vector<string> mystr2(mystr); //把mystr拷贝给了mystr2
vector<string> mystr3 = mystr; //把mystr拷贝给了mystr3
- c++11标准中,可以用列表来初始化的方法来给值,用{}括起来
vertor<string> mystr4 = {"aaa","bbb","ccc"};
- 创建制定数量的元素,有元素数量概念的东西,一般会用圆括号。
vertor<int> ijihe(15,200); //创建15个int类型的元素
vertor<int> ijihe(20); //20个0
vector<string> sjihe(5); //5个“”
- 多种初始化方式,()一般表示元素数量的概念。{}一般表示元素内容的概念。
//Tips:要想正常地通过{}进行初始化,那么{}内的值的类型必须和vector后面的<>里面的元素类型相同
vertor<string> s{10}; //10个元素,此时虽是大括号,但10为元素数量,因为10不是string类型
vertor<int> i1{10,4}; //2元素,第一个为10,第二个为4;等同于初始化列表
vertor<int> i2{"hello"}; //报错
vector对象上的操作
//一般来说,vertor的常用操作为创建空vector后动态地增加/减少元素
- empty(): 判断是否为空,返回布尔值
vertor<int> ivec;
if (iver.empty())
{
cout << "ivec为空";
}
- push_back(): 用于向vector的末尾增加一个元素
for(int i = 1; i<=100; i++)
{
ivec.push_back(i);
}
- size(): 返回元素个数
cout << ivec.size();
- clear(): 将容器清空
ivec.clear();
cout << ivec.size(); //0
- v[n]: 返回v中第n个元素,位置从0开始,必须小于v.size()
cout << ivec[99]; //100
- =: 赋值
vertor<int> ivec2;
ivec2.push_back(111);
ivec2 = ivec; //ivec2得到了100个元素,ivec2原来的元素被冲掉了
ivec2 = {11,12,13,14};
cout << ivec2.size(); //4
- ==,!=: 相等,不相等,需要元素数量相同,对应位置的元素值也一样
ivec2 = ivec;
if (ivec2 == ivec)
cout << "ivec2 == ivec"; //成立
ivec2.push_back(123);
if (ivec2 != ivec)
cout << "ivec2 != ivec"; //成立
ivec.clear();
ivec2.clear();
if (ivec2 == ivec)
cout << "ivec2 == ivec"; //成立
- 范围for的应用
vector<int> vecvalue{1,2,3,4,5};
for (auto &vecitem : vecvalue)
{
vecitem *= 2; //扩大一倍
}
- 范围for进一步讲解
vector<int> vecvalue{1,2,3,4,5};
for (auto vecitem : vecvalue)
{
vecvalue.push_back(888); //序列结束位置改变了,导致输出彻底乱套
cout << vecitem;
}
//结论:在遍历一个容器的过程中,千万不要改动vector容器的容量,增加/删除都不可以
迭代器遍历容器时,容器的大小不可以发生变化。当容器扩大时,迭代器指向扩大的部分并不能得到容器元素,而是越界。