ARTICLE DETAIL

资讯详情

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

vector的模拟实现与迭代器失效

vector的模拟实现与迭代器失效 目录一简言二构造函数与析构函数1默认构造函数和拷贝构造函数2迭代器区间构造函数3填充构造函数4析构函数5构造时的匹配错误三赋值重载四迭代器相关函数五容量相关函数1空间大小与元素个数2改变容量reverse与数据个数resize3尾插和尾删4,reserve的缺陷与报错六访问与打印容器七迭代器失效一简言模拟实现vector全代码gitee链接https://gitee.com/codelsj-w/test9.15.git私有成员分析vector是C的一个泛型容器需要融入STL体系同时在构造函数等函数中迭代器经常被使用所以vector容器的私有成员可以使用迭代器实现。vector容器的私有成员变量主要由三部分构成vector也可以使用T* _data; size_t _size; size_t _capacitystring也可以使用迭代器不过string的迭代器使用的比较少二构造函数与析构函数泛型容器模版通过T可以让vector中存储任意类型的数据iterator实际就是数据类型指针补充解释const allocator_type alloc allocator_type()这一部分用来指定内存分配器allocator_type这是std::vector类内部的一个类型别名typedef。对于普通的std::vectorintallocator_type实际上就是std::allocatorint。表示按引用传参避免拷贝分配器对象分配器通常是无状态的但拷贝也有开销。const表示在构造函数内部不允许修改这个传入的分配器对象。alloc这是参数的名字。 allocator_type()这是默认参数。意思是如果你在创建vector时不传这个参数编译器会自动帮你构造一个默认的allocator_type对象即使用标准库默认的内存分配器在 C 中STL 容器如vector、list、map被设计为“内存分配”与“对象构造”分离。vector需要动态在堆上申请内存但它不直接用new和delete而是委托给分配器Allocator来做。默认场景下写std::vectorint v;时实际上等价于std::vectorint v(std::allocatorint());。这个默认分配器底层就是调用operator new和operator delete。只有对内存分配有特殊需求的场景下才会使用。1默认构造函数和拷贝构造函数默认构造作用创建一个空的 vector不包含任何元素size() 0capacity() 0。拷贝构造使用另一个同类型的 vectorx来创建一个新的 vector新 vector 包含x中所有元素的深拷贝。2迭代器区间构造函数核心利用迭代器区间[first, last)左闭右开来初始化 vector。它会将区间内的所有元素拷贝到新 vector 中。特点这是最灵活的构造函数。InputIterator可以是任何输入迭代器比如其他容器的迭代器、原生指针3填充构造函数作用创建包含n个元素的 vector每个元素的值都是val的拷贝。参数n要创建的元素个数。val每个元素的初始值。如果省略则使用值初始化对于int是 0对于自定义类会调用默认构造函数4析构函数5构造时的匹配错误三赋值重载两种写法传统写法reserve可以提前开辟空间防止在进行尾插时空间不够时多次进行空间的开辟。现代写法v1 v2 将v2传入拷贝构造一个新的vector容器v借助v容器进行交换原来的容器v2不会改变。四迭代器相关函数五容量相关函数1空间大小与元素个数2改变容量reverse与数据个数resizeresize的实现reverse的实现3尾插和尾删4,reserve的缺陷与报错预期的打印结果为五个相同的字符串但是报错了这是为什么呢根本原因在于深浅拷贝的问题六访问与打印容器访问打印容器容器模版七迭代器失效insert:在指定位置插入元素迭代器失效分析 erase:删除指定位置的元素结合实例分析失效:修改后使用这种方式上面的三种情况都不会出现错误补充模拟实现string类中的insert和erase迭代器函数也有可能造成迭代器失效的问题不过string的迭代器一般使用的很少八题目补充1只出现一次的数字class Solution { public: int singleNumber(vectorint nums) { int num1 0; //对数组当中的每个数的2进制位进行统计加和 for(int i 0;i32;i) { int total 0; for(int n : nums) { if((n i) 1 1) //如果是1就进行 { total; } } if(total % 3) //如果不是三的倍数说明答案的那一位是1 { num1 | (1i); } } return num1; } };解题思路1对数组当中的每个数的每一2进制位进行统计由于相同的数会出现三次不考虑答案这个数的话结果一定为3的倍数或者为0而这个数的这一位可能为0或1如果为1加上之后对3进行整除就会余1;如果是0加上之后对3进行整除就会余0余1的情况就表明答案这个数的这个二进制位为1通过| (1 i)加上即可2数组当中出现次数超过一半的数字
返回列表