1. 在不确定的情况下使用at而不是operator[] 2. 什么类型不可以作为vector的模板类型 3. 什么情况下vector的迭代器会失效 4. vector怎么迅速的释放内存 4.1 通过swap函数 4.2 使用shrink_to_fit函数 5.泛型push_back是深拷贝还是浅拷贝: 依赖于拷贝构造函数的实现。 vector就是一个动态数组,地址是连续的,可以...
刚才那个代码其实也是不正确的不过他不正确的原因是因为memmove的底层实现其实是浅拷贝是以字节为单位进行拷贝的 因为刚才我们这个vector里面存放的数据类型是int这种内置类型而对于内置类型来说是不会受到浅拷贝的影响的不过对于开辟在堆上的自定义类型来说就会受到浅拷贝的影响导致出现同一内存空间多次释放的错误 比方说...
编译器调用拷贝构造生成形参后,在调用swap()函数依次交换形参和this即可。 //赋值重载void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v_endofstorage);}vector<T>& operator= (vector<T> tmp){swap(tmp);return *this;} 3 析构...
1、vector使用的是深拷贝。 2、选择合适的拷贝算法。 /3、拷贝两类: (一)对于POD类型直接采用memcpy进行拷贝; (二)对于非POD类型需要采用for循环加new定位表达式; 4、切记拷贝完成之后释放掉原来的旧空间 源码之前,了无秘密 // 本实作中默认构造出的vector不分配内存空间 vector() : start(0), finish(0), ...
0x01 赋值构造 operator= 传统写法就是把 v2 赋值给 v1,自己把 v1 释放了,再去深拷贝出 v2 一样大的空间…… 太麻烦了,直接用现代写法,只要有了拷贝构造,赋值都可以用现代写法。 并且,这里还可以利用 "传参调用拷贝构造" 这一特性,做到真正的 "压榨" 工具人。
vector<T>tmp(v.begin(), v.end());swap(tmp);//当然自定义类型自己写的swap更高效 -- 我们自己实现一个}#endifvector<T>&operator=(vector<T> v) {//v1=v2//v是v2的拷贝,而且是局部的,swap完之后给到v1,v还会自动析构(因为是局部对象)swap(v);return*this; ...
Vector<T>& operator=(Vector<T> v) { // 这里我们不传入 引用,这里就编译器自动调用拷贝构造,我们直接可以传入了. swap(v); return *this; } 析构函数 这里把析构函数给写出来,避免内存泄漏. ~Vector() { if(_start) { delete[] _start; ...
vector<T>& operator=(vector<T> v)//这里没用使用引用,即在创建v时会开辟一个新的空间 { swap(v);//此时直接调用swao函数即可,且v为形参,swap后获得this原本的数据,函数结束时v同原本this数据一同释放 return *this; } 1. 2. 3. 4. 5.
对于简单的内置类型或自定义类型,memcpy是一个不错的选择,既高效又实用。但是一旦元素涉及到资源申请,memcpy只是简单的将一个元素的值拷贝给另一个元素,并不会将该元素指向的空间的内容全部拷贝给另一个元素。所以,我们必须手动实现深拷贝。 🍁错误示例