1. 在不确定的情况下使用at而不是operator[] 2. 什么类型不可以作为vector的模板类型 3. 什么情况下vector的迭代器会失效 4. vector怎么迅速的释放内存 4.1 通过swap函数 4.2 使用shrink_to_fit函数 5.泛型push_back是深拷贝还是浅拷贝: 依赖于拷贝构造函数的实现。 vector就是一个动态数组,地址是连续的,可以...
刚才那个代码其实也是不正确的不过他不正确的原因是因为memmove的底层实现其实是浅拷贝是以字节为单位进行拷贝的 因为刚才我们这个vector里面存放的数据类型是int这种内置类型而对于内置类型来说是不会受到浅拷贝的影响的不过对于开辟在堆上的自定义类型来说就会受到浅拷贝的影响导致出现同一内存空间多次释放的错误 比方说...
1、vector使用的是深拷贝。 2、选择合适的拷贝算法。 /3、拷贝两类: (一)对于POD类型直接采用memcpy进行拷贝; (二)对于非POD类型需要采用for循环加new定位表达式; 4、切记拷贝完成之后释放掉原来的旧空间 源码之前,了无秘密 // 本实作中默认构造出的vector不分配内存空间 vector() : start(0), finish(0), ...
vector<T>& operator=(vector<T> v)//这里没用使用引用,即在创建v时会开辟一个新的空间 { swap(v);//此时直接调用swao函数即可,且v为形参,swap后获得this原本的数据,函数结束时v同原本this数据一同释放 return *this; } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17...
Vector<T>& operator=(Vector<T> v) { // 这里我们不传入 引用,这里就编译器自动调用拷贝构造,我们直接可以传入了. swap(v); return *this; } 析构函数 这里把析构函数给写出来,避免内存泄漏. ~Vector() { if(_start) { delete[] _start; ...
对于简单的内置类型或自定义类型,memcpy是一个不错的选择,既高效又实用。但是一旦元素涉及到资源申请,memcpy只是简单的将一个元素的值拷贝给另一个元素,并不会将该元素指向的空间的内容全部拷贝给另一个元素。所以,我们必须手动实现深拷贝。 🍁错误示例
* operator.apply方法中不能调用修改结构的方法 *@paramoperator 指定规则,函数式接口 */publicsynchronizedvoidreplaceAll(UnaryOperator<E> operator){ Objects.requireNonNull(operator);finalintexpectedModCount=modCount;finalintsize=elementCount;for(inti=0; modCount == expectedModCount && i < size; i++) ...
当我们实现的reserve函数中,拷贝数据使用的是memcpy时,就会导致浅拷贝问题。 vector中存储的是自定义类型的时候还没有问题,可一旦是自定义类型,那就会导致程序崩溃。 使用memcpy拷贝后,扩容后空间里面的内容还是会指向原空间,这样就导致了两次析构。 所以我们是不能直接用memcpy拷贝的。
当然我们还是去实现最基本也是重要最常用的那部分...= end) { push_back(*first); ++first; } } vector(const vector& v) { reserve(...v.capacity()); for (auto& e : v) { push_back(e); } } vector& operator=(vectorvector构造函数在两个构造函数都存在的情况下程序正常运行 void test() ...