Java 转 C++ 系列:STL容器之vector
文章参考黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难STL中的vector容器的一点总结文章目录一、vector容器简介二、vector和数组的主要区别三、 vecotr容器中的使用3.1 构造函数3.2 vector赋值操作3.3 vector容量和大小3.4 vector插入和删除3.5 vector数据存取3.6 vector互换容器3.7 vector预留空间四、扩展4.1 迭代器输出4.2 存放自定义数据类型4.3 容器嵌套容器一、vector容器简介vector数据结构和数组非常相似也称为单端数组。vector又被称为向量vector可以形象的描述为长度可以动态改变的数组功能和数组较为相似。实际上更专业的描述为vector是一个多功能的能够操作多种数据结构和算法的模板类和函数库vector之所以被认为是一个容器是因为它能够像容器一样存放各种类型的对象。简单地说vector是一个能够存放任意类型的动态数组能够增加和压缩数据。注STL的容器从实现的角度讲可以说是类模板class teplate)二、vector和数组的主要区别数组分配的是静态空间一般分配了就不可以改变就像我们熟知的定义了一个数组那么数组的长度就不可以改变了我们也不可以进行越界访问但是编译器不检查越界这一点在我们编程的时候要尤为注意很多都可能会烦这样的错误。一般申请的数组长度不能满足我们的要求了我们要重新申请大一点数组然后把原数组中数据复制过来。vector分配的是动态空间即我们声明vector容器的时候可以不指定容器的大小vector是随着元素的加入空间自动扩展的。但是我们必须要负责任的肯定vector分配的空间是连续的也就是支持数组中的下标随机访问。vector的实现机制是预留一部分空间而且预留空间的大小是按一定比率增长的如果空间不够用的话要保证连续就必须重新new一片空间然后将原有元素移动到新空间同时预留新的空间最后将原来的那部分空间释放掉。这样预留空间的好处就是不用每次向vector中加元素都重新分配空间。另外使用 vector 要求添加头文件#includevector三、 vecotr容器中的使用3.1 构造函数vector容器的构造函数声明方式主要有以下几种vectorElemv;// 创建空vector默认构造函数vectorElemv1(v);// 拷贝构造函数用另一个vector初始化vectorElemv(n);// 含n个元素元素进行值初始化int默认0vectorElemv(n,elem);// 含n个elem元素的拷贝vectorElemv(beg,end);// 用[beg, end)左闭右开区间初始化示例代码//第一种方式vectorintv1;// 1 2 3//v1 { 1,2,3 };v1.push_back(1);v1.push_back(2);v1.push_back(3);//第二种方式vectorintv2(v1);// 1 2 3//第三种方式vectorintv3(5);// 0 0 0 0 0int 默认 0//第四种方式vectorintv4(5,4);// 4 4 4 4 4 5个4//第五种方式迭代器方式vectorintv5(v1.begin(),v1.end());// 1 2 3//第五种种方式指针方式inta[]{1,2,3,4,5,6};vectorintv6(a,a6);// 1 2 3 4 5 6注vector Elem v(beg,end)声明方式创建一个和[beg,end)区间元素相同的 vector一定要注意是左闭右开。包括v.end()函数也是返回的vector末端的下位置相当于int a[n]的a[n]并不能访问。另外值得注意的是以下两种方法是两种初始化方法vectorintv1;// 无参构造v1{1,2,3};// 赋值操作 → 调用重载的 vectorintv2{1,2,3};// 初始化列表构造vectorintv3{1,2,3};// 等价写法纯初始化3.2 vector赋值操作vectoroperator(constvectorvec);,重载等号操作符assign(beg,end);,将[beg,end)区间中的数据拷贝赋值给本身assign(n,elem);,将n个elem拷贝赋值给本身示例代码vectorintv1;//无参构造v1{1,2,3};vectorintv2v1;// 重载等号操作符vectorintv3;v3.assign(v1.begin(),v1.end());// 1 2 3vectorintv4;v4.assign(3,99);//3个99// 99 99 99v4.assign(2,100);// 完全覆盖// 100 100注assign函数会做 覆盖3.3 vector容量和大小empty();,判断容器是否为空capacity();,容器的容量size();,返回容器中元素的个数resize(intnum);,重新指定容器的长度为num若容器变长则以默认值填充新位置若容器变短则末尾超出长度的元素被删除resize(intnum,elem);,重新指定容器的长度为num若容器变长则以elem值填充新位置若容器变短则末尾超出长度的元素被删除示例代码vectorintv1{1,2,3};if(v1.empty()){coutv1为空endl;}else{coutv1不为空endl;coutv1的容量 v1.capacity()endl;// 3coutv1的大小 v1.size()endl;// 3}//resize 重新指定大小 若指定的更大默认用0填充新位置可以利用重载版本替换默认填充v1.resize(6,8);// 1 2 3 8 8 8//resize 重新指定大小 若指定的更小超出部分元素被删除v1.resize(5);// 1 2 3 8 83.4 vector插入和删除push_back(ele);,尾部插入元素elepop_back();,删除最后一个元素insert(const_iterator pos,ele);,迭代器指向位置pos插入元素eleinsert(const_iterator pos,intcount,ele);,迭代器指向位置pos插入count个元素eleerase(const_iterator pos);,删除迭代器指向的元素erase(const_iterator start,const_iterator end);,删除迭代器从start到end之间的元素clear();,删除容器中所有元素示例代码vectorintv1;//尾插v1.push_back(10);v1.push_back(20);v1.push_back(30);// 10 20 30//尾删v1.pop_back();// 10 20//插入v1.insert(v1.begin(),100);// 100 10 20v1.insert(v1.begin(),2,1000);// 头部插入两个1000// 1000 1000 100 10 20//删除v1.erase(v1.begin());// 1000 100 10 20//清空v1.erase(v1.begin(),v1.end());v1.clear();3.5 vector数据存取at(intidx);,返回索引idx所指的数据operator[];,返回索引idx所指的数据front();,返回容器中第一个数据元素back();,返回容器中最后一个数据元素示例代码vectorintv1{200,100,10,20};for(inti0;iv1.size();i){coutv1[i] ;}coutendl;for(inti0;iv1.size();i){coutv1.at(i) ;}coutendl;coutv1的第一个元素为 v1.front()endl;// 200coutv1的最后一个元素为 v1.back()endl;// 203.6 vector互换容器swap(vec);,将vec与本身的元素互换示例代码vectorintv1{1,2,3,4};vectorintv2{5,6,7,8};v1.swap(v2);printVector(v1);printVector(v2);// v1: 5 6 7 8// v2: 1 2 3 43.7 vector预留空间动态扩展vectorintv;// 空容器没存数据cout空容器sizev.size() capacityv.capacity()endl;// 0 0// 添加4个元素v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);cout存4个数sizev.size() capacityv.capacity()endl;// 4 4// 继续添加第5个元素v.push_back(5);cout存5个数sizev.size() capacityv.capacity()endl;// 5 6但是如果数据量较大在添加元素时会多次扩展因此可以一开始预留空间reserve(int len); //容器预留len个元素长度预留位置不初始化元素不可访问。示例代码统计 vector 在连续插入 10 万个元素的过程中内存扩容的次数//预留能存储10000个元素的内存空间v.reserve(100000);intnum0;// 统计开辟次数int*pNULL;for(inti0;i100000;i){v.push_back(i);if(p!v[0]){// 若指针不等于首地址即扩展时P失效pv[0];num;}}coutnum:numendl;// 1注因为预留了足够多的内存空间因此不会发生扩展四、扩展4.1 迭代器输出每一个容器都有自己的迭代器迭代器是用来遍历容器中的元素v.begin()返回迭代器这个迭代器指向容器中第一个数据v.end()返回迭代器这个迭代器指向容器元素的最后一个元素的下一个位置vectorint::iterator拿到 vector 这种容器的迭代器类型用于声明迭代器变量ite以遍历或操作容器可以把它当成指针用。遍历示例如下#includeiostream#includestring#includevector#includealgorithmusingnamespacestd;voidMyPrint(intval){coutvalendl;}// 函数传递方式voidprintVector(constvectorintv){// 因为形参添加const所以迭代器添加const_iteratorfor(vectorint::const_iterator itv.begin();it!v.end();it){cout*it ;}coutendl;}// C11 简化写法不用管迭代器类型voidprintVector2(constvectorintv){// 通用极简写法const 容器必用for(constautoval:v){coutval ;}coutendl;}intmain(){system(chcp 65001 nul);//创建vector容器对象并且通过模板参数指定容器中存放的数据的类型vectorintv;//向容器中放数据v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);vectorint::iterator pBeginv.begin();vectorint::iterator pEndv.end();//第一种遍历方式while(pBegin!pEnd){cout*pBeginendl;pBegin;}//第二种遍历方式for(vectorint::iterator itv.begin();it!v.end();it){cout*itendl;}//第三种遍历方式//使用STL提供标准遍历算法 头文件 algorithmfor_each(v.begin(),v.end(),MyPrint);//第四种遍历方式for(intx:v){coutxendl;}system(pause);return0;}4.2 存放自定义数据类型#includeiostream#includevector#includestringusingnamespacestd;//自定义数据类型classPerson{public:Person(string name,intage):m_Name(name),m_Age(age){}public:string m_Name;intm_Age;};//存放对象voidtest01(){vectorPersonv;//创建数据Personp1(aaa,10);Personp2(bbb,20);Personp3(ccc,30);v.push_back(p1);v.push_back(p2);v.push_back(p3);for(vectorPerson::iterator itv.begin();it!v.end();it){coutName:(*it).m_Name Age:(*it).m_Ageendl;}}//放对象指针voidtest02(){vectorPerson*v;//创建数据Personp1(aaa,10);Personp2(bbb,20);Personp3(ccc,30);v.push_back(p1);v.push_back(p2);v.push_back(p3);for(vectorPerson*::iterator itv.begin();it!v.end();it){Person*p(*it);coutName:p-m_Name Age:p-m_Ageendl;}}intmain(){test01();test02();system(pause);return0;}4.3 容器嵌套容器vectorvectorintv{{1,2,3},{4,5,6}};for(vectorvectorint::iterator itv.begin();it!v.end();it){for(vectorint::iterator vit(*it).begin();vit!(*it).end();vit){cout*vit ;}coutendl;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2539886.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!