做网站设计所遇到的问题,百度网址是多少,lsp专用浏览器,wordpress获取时间函数前言#xff1a;我们已经理解了vector的初始化和迭代器初始化#xff0c;那么接下来要继续深入理解vector#xff0c;它是如何扩容的#xff0c;空间及数据个数是如何存储的。 vector空间增长问题 容量空间接口说明size获取数据个数capacity获取容量大小empty判断是否为空…前言我们已经理解了vector的初始化和迭代器初始化那么接下来要继续深入理解vector它是如何扩容的空间及数据个数是如何存储的。vector空间增长问题容量空间接口说明size获取数据个数capacity获取容量大小empty判断是否为空resize改变vector的sizereserve改变vector的capacitycapacity的代码在vs和g下分别运行会发现vs下capacity是按1.5倍增长的g是按2倍增长的。这个问题经常会考察不要固化的认为vector增容都是2倍具体增长多少是根据具体的需求定义的。vs是PJ版 STLg是SGI版本STL。reserve只负责开辟空间如果确定知道需要用多少空间reserve可以缓解vector增容的代价缺陷问题。resize在开空间的同时还会进行初始化。代码案例#define_CRT_SECURE_NO_WARNINGS1#includeiostream#includevectorusingnamespacestd;voidtestVector1(){// 初始化一个空的vectorvectorintv;// 1. empty()判断容器是否为空cout初始状态下vector是否为空boolalphav.empty()endl;// 2. size() / capacity()获取初始大小和容量cout初始 size: v.size(), 初始 capacity: v.capacity()endl;// 3. reserve()预分配容量不会改变有效元素个数v.reserve(10);cout调用 reserve(10) 后size: v.size(), capacity: v.capacity()endl;// 添加一些元素for(inti0;i5;i){v.push_back(i1);}cout添加5个元素后size: v.size(), capacity: v.capacity()endl;// 4. resize()改变有效元素个数// 1resize 到比当前size小会截断元素v.resize(3);cout调用 resize(3) 后size: v.size(), capacity: v.capacity()endl;cout当前元素;for(intnum:v)coutnum ;coutendl;// 2.resize 到比当前size大会用默认值0填充新位置v.resize(7);cout调用 resize(7) 后size: v.size(), capacity: v.capacity()endl;cout当前元素;for(intnum:v)coutnum ;coutendl;//3resize 到比当前size大并用指定值填充v.resize(10,100);cout调用 resize(10, 100) 后size: v.size(), capacity: v.capacity()endl;cout当前元素;for(intnum:v)coutnum ;coutendl;// 4. 再次验证empty()cout最终状态下vector是否为空boolalphav.empty()endl;}voidTestVector2(){size_t sz;vectorintv;szv.capacity();coutmaking v grow:\n;for(inti0;i100;i){v.push_back(i);if(sz!v.capacity()){szv.capacity();coutcapacity changed: sz\n;}}}intmain(){//testVector1();TestVector2();return0;}vector 增删查改vector增删查改接口说明push_back尾插pop_back尾删find查找insert头插在pos之前插入valerase删除pos位置的数据swap交换两个vector的数据空间operator[]像数组一样访问数据那这里就要提一下了vector没有实现输入输出流的重载。但是我们可以通过下标的方式打印#includeiostream#includevectorusingnamespacestd;intmain(){vectorintv{1,2,3,4,5};// 1. operator[]像数组一样访问元素cout1. 使用 operator[] 访问第3个元素v[2]endl;v[2]30;// 修改元素cout修改后元素;for(intnum:v)coutnum ;coutendl;// 2. push_back尾插元素v.push_back(6);v.push_back(7);cout2. 尾插6、7后元素;for(intnum:v)coutnum ;coutendl;// 3. pop_back尾删元素v.pop_back();cout3. 尾删后元素;for(intnum:v)coutnum ;coutendl;// 4. find查找元素注意是算法库函数不是vector成员autoitfind(v.begin(),v.end(),30);if(it!v.end()){cout4. 找到元素30位置索引it-v.begin()endl;}else{cout4. 未找到元素30endl;}// 5. insert在指定位置插入元素itv.insert(it,25);// 在30前面插入25cout5. 插入25后元素;for(intnum:v)coutnum ;coutendl;// 6. erase删除指定位置元素itfind(v.begin(),v.end(),25);v.erase(it);cout6. 删除25后元素;for(intnum:v)coutnum ;coutendl;// 7. swap交换两个vector的数据空间vectorintv2{10,20,30};cout7. 交换前 v;for(intnum:v)coutnum ;coutendl;cout交换前 v2;for(intnum:v2)coutnum ;coutendl;v.swap(v2);cout交换后 v;for(intnum:v)coutnum ;coutendl;cout交换后 v2;for(intnum:v2)coutnum ;coutendl;return0;}vector实例化其实不止是内置类型也可以是vectorstring、vectorvectorint等自定义类型。vectorvectorint这种类似于二维数组遍历也是用双括号[][]来遍历#includeiostream#includevector#includestringusingnamespacestd;intmain(){// 1. vectorstring 实例化vectorstringstr_vec;str_vec.push_back(Hello);str_vec.push_back(C);str_vec.push_back(Vector);cout1. vectorstring 元素endl;for(conststrings:str_vec){couts ;}coutendl;// 2. vectorvectorint 嵌套实例化二维数组vectorvectorintvec_vec;// 初始化3行4列的二维vectorfor(inti0;i3;i){vectorintrow;for(intj0;j4;j){row.push_back(i*10j);}vec_vec.push_back(row);}cout\n2. vectorvectorint 二维数组endl;for(constvectorintrow:vec_vec){for(intnum:row){coutnum ;}coutendl;}// 3. 访问嵌套vector的元素cout\n3. 访问第2行第3列元素vec_vec[1][2]endl;return0;}vector 迭代器失效问题迭代器的主要作用就是让算法能够不用关心底层数据结构其底层实际就是一个指针或者是对指针进行了封装比如vector的迭代器就是原生态指针T* 。因此迭代器失效实际就是迭代器底层对应指针所指向的空间被销毁了而使用一块已经被释放的空间造成的后果是程序崩溃(即如果继续使用已经失效的迭代器程序可能会崩溃)。对于vector可能会导致其迭代器失效的操作有会引起其底层空间改变的操作都有可能是迭代器失效比如resize、reserve、insert、assign、push_back等。#includeiostreamusingnamespacestd;#includevectorintmain(){vectorintv{1,2,3,4,5,6};autoitv.begin();// 将有效元素个数增加到100个多出的位置使用8填充操作期间底层会扩容// v.resize(100, 8);// reserve的作用就是改变扩容大小但不改变有效元素个数操作期间可能会引起底层容量改变// v.reserve(100);// 插入元素期间可能会引起扩容而导致原空间被释放// v.insert(v.begin(), 0);// v.push_back(8);// 给vector重新赋值可能会引起底层容量改变v.assign(100,8);/* 出错原因以上操作都有可能会导致vector扩容也就是说vector底层原理旧空间被释 放掉而在打印时it还使用的是释放之间的旧空间在对it迭代器操作时实际操作的是一块 已经被释放的空间而引起代码运行时崩溃。 解决方式在以上操作完成之后如果想要继续通过迭代器操作vector中的元素只需给 it重新赋值即可。 */while(it!v.end()){cout*it ;it;}coutendl;return0;}指定位置元素的删除操作–erase#includeiostreamusingnamespacestd;#includevectorintmain(){inta[]{1,2,3,4};vectorintv(a,asizeof(a)/sizeof(int));// 使用find查找3所在位置的iteratorvectorint::iterator posfind(v.begin(),v.end(),3);// 删除pos位置的数据导致pos迭代器失效。v.erase(pos);cout*posendl;// 此处会导致非法访问return0;}erase删除pos位置元素后pos位置之后的元素会往前搬移没有导致底层空间的改变理论上讲迭代器不应该会失效但是如果pos刚好是最后一个元素删完之后pos刚好是end的位置而end位置是没有元素的那么pos就失效了。因此删除vector中任意位置上元素时vs就认为该位置迭代器失效了。