ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

vectoe 2

vectoe 2 假如现在不扩容上图就是下图对应的另外一种迭代器失效在实际应用时我们并不知道insert后是扩容还是没有扩容从而判断出旧p是否是野指针还能不能用所以我们认为使用insert之后不管是否扩容我们都认为迭代器失效不能用旧p位置要使用旧p也要将它更新再用不同平台对于使用insert之后若再次使用旧p有不同反应vs会直接报错g不会g下使用insert扩容后依旧给旧p位置赋值如下图程序居然也没有崩溃即系统没有检查出来。万一系统将已经释放的空间拿去重新使用会直接将其中数据修改很危险。g使用insert后再使用旧p,扩不扩容都不报错。vs使用insert后再使用旧p,扩不扩容都报错所以使用insert之后vs做的处理比g好11.erase模拟实现删除后是否认为删除位置及以后位置的迭代器失效删除后不同平台是否会进行缩容处理若缩容还要注意删除位空间是否被缩容归还给系统完成模拟1.现在删除插入值中的偶数完成代码运行正常2.但有多个偶数时删不干净分析发现第一个偶数2利用erase删除it位置2it后所有元素都自动向前移位finish--此时it依旧是原来指向2的旧指针it就指向了4。发现偶数4(第一个)利用erase删除it位置4it后所有元素都自动向前移位finish--此时it依旧是原来指向偶数4(第一个)的旧指针但此时该位置是第二个4it就跳过4指向了53.有时奔溃 如下插入1234在将2删除it后所有元素向前移动一位finish--it依旧指向原先2位置该位置现在是3跳过3。it指向4erase删除4函数内itend(),finish--,此时finish指向4it此时it指向4后的位置此时it已经越界且it在后finish在前两者已经错开函数内it、end永远不相等。若再次调用erase此时finishpos,断言报错。以上三种情况在g运行结果也会发生和在VS上运行一样但是用vs库里的vector都进行了强制检查,一个都过不去和之前insert一样因为erase之后还在用it,。库中的erase删除完成后移位完成会返回一个迭代器迭代器指向被删除元素的下一个元素位置的指针。所以对于使用库中的erase后不管平台锁不锁荣我们也都认为旧的迭代器失效要用也要用erase返回的新指针更新下再用。我们模拟实现时并没有返回值正确使用模拟实现erase的代码应该是这样如果是偶数时才会删除之后it不如果是奇数才it几乎所有容器erase后迭代器失效但insert不一定看是否扩容操作失效范围有效部分返回迭代器erase(pos)pos以及pos 之后全部迭代器pos 之前迭代器有效指向被删除元素的下一个元素有效insert(pos,val) 不扩容pos以及pos 之后全部迭代器pos 之前迭代器有效指向新插入的元素有效insert(pos,val) 触发扩容容器全部迭代器全部失效无指向新插入的元素有效string也有迭代器失效12.resize下图两种写法一样 自定义模板内给缺省值一般都是如下图T一样给模拟实现13.拷贝析构函数如下图 v v1 浅拷贝了若此时析构不会崩溃因为自动生成的析构函数不会释放申请的资源从而造成内存泄漏补上析构函数程序崩溃 v v1 浅拷贝了所以需要手动写深拷贝的拷贝构造引用。e是元素的引用不是拷贝副本e是对v中每一个元素的别名不会拷贝元素这里显示地写了构造自动生成的默认构造就不会生成了所以需要显示写勾造函数因为我们给了缺省值且无自定义成员变量所以仅仅如下图写即可运行成功改名称为回看拷贝构造发现里面的push_back可能还要扩容这样效率有点低改进提前开和被拷贝对象有效长度一样大的空间push_back只在该空间内放值即可14.赋值 operator传统写法clear函数不用将申请的空间释放只是将数据清空即可运行成功现代写法实参是v3形参v是传值会调用拷贝构造函数把v3深拷贝一份生成局部临时对象v交换this(v1)和局部对象v的三个指针。函数结束局部变量v出作用域自动调用析构函数把 v1 原来旧堆内存释放掉。return *this支持链式赋值 abc。这里的swap是我们自己模拟出来的14.用迭代器区间构造 的模拟实现模拟实现测试运行成功我们先在验证其他容器调用它的情况 添加list15.模拟用n个val初始化vector对象的函数将string类包进来再次测试1.什么叫 “迭代器”迭代器像一个指向容器中某个元素的游标需满足以下一个或多个功能解引用 *it拿到它指向的元素it向后移动指向下一个元素! / 判断是否走到末尾迭代器根据拥有的功能分为不同迭代器。下一节进一步介绍InputIterator只是模板参数名字编译器不会把它当成迭代器也不会校验你传入的是否是迭代器只是使用时期望使用者传入的实参是迭代器。模板形数匹配规则同一个模板参数InputIterator要求两个实参的类型可以推导成同一个类型。若满足此规则就可以优先调用该函数模板上图显示报错报到迭代器区间初始化上了为什么两个实参的类型可以推导成int型在与两种识别方式比较后选择最匹配的函数而后*first相当于是对int进行解引用当然报错解决方法直接给更加合适的函数16.测试 vector容器内是string类对象没扩容· 成功运行再次插入扩容分析只要vector内是申请了资源的自定义类型memcpy就会浅拷贝出错解决办法将memcpy那句代码替换为循环将旧空间元素string类对象赋值给新空间元素string类对象这样的话相当于调用string类对象的运算符重载函数深拷贝了重新运行长的函数定义记得放到类外若是函数模板到时候记得加模板参数前不要写类名记得写类型如下
返回列表