哪个网站可以做代练,网店美工的技能要求,大美工网站,wordpress非常吃cpu一.迭代器失效
1.定义
指原迭代器在扩容/缩容/修改后指向无效元素或无效地址处
erase的迭代器失效
2.原因#xff1a;
1.有的编译器实现erase会缩容拷贝 2.删除最后一个后#xff0c;其指向无效元素
VS中不允许再次使用erase完的迭代器#xff0c;为了让编写的代码移植…一.迭代器失效
1.定义
指原迭代器在扩容/缩容/修改后指向无效元素或无效地址处
erase的迭代器失效
2.原因
1.有的编译器实现erase会缩容拷贝 2.删除最后一个后其指向无效元素
VS中不允许再次使用erase完的迭代器为了让编写的代码移植性强其通过实现vector迭代器类型为复合一个标识与其他的原生指针。
g中允许访问失效的迭代器。
3.怎么访问删除的位置
erase中提供了迭代器传入返回迭代器的方法用迭代器接收即为原删除位置的下一个位置。
例
二.拷贝构造
默认的拷贝构造当类中含有要释放的资源时会析构两次修改也不能单独修改对于可以传入自定义类型的vector需要自己写拷贝构造。
拷贝构造可以复用之前的reserve空间增加效率减少频繁开空间消耗push_back传入的内容。
vector(const vectorT v){reserve(v.capacity());for (auto e : v){push_back(e);}}
注意拷贝构造也算构造一旦有了默认构造不在生成但我们已经给了缺省值有自定义构造函数则无默认构造函数无自定义复制构造函数则隐含生成默认复制构造函数。用
vector() default;
强制生成默认构造default仅可用于写默认成员函数
三。赋值运算符重载
用“现代写法”传值传参来再用swap换取拷贝的。要写vector::swapstd中的swap为浅拷贝且仅有已有类型。
四。不同迭代器初始化
为什么使用迭代器初始化可以用类的某个区间迭代器初始化
不同类型用int数组都能初始化vectorchar
用函数模板支持任意类型的迭代器区间初始化
五。n个value构造 value的缺省值不能是0有的自定义类型不能从0转化。--》缺省值用匿名对象
内置类型在C中也有了构造函数如int i(3),int()----兼容模板让内置与自定义类型都可以构造
vector(size_t n,const TvalueT());
六。一个大坑调用歧义
vectorchar/vectorint/...........
vector(10,1)时因为1与char不匹配再找找到迭代器模板函数两个同型匹配上了就把它们当作了迭代器.
解决1.用的时候加个u表示10是unsigned int
2.给个重载的版本如vector(int n,.....)n改为int减少问题n个value的n平时直接传就没问题了
七..花括号初始化
用于多参数的隐式类型转换。一切都可用花括号初始化
1.单参数A a(1);/A a1;/A a{1}/A a{1,2}
2.多参数A a{1,2}不能小括号
构造拷贝构造
3.参数个数不固定的,系统支持的initializer_list类型,常量数组的类型{1,2,3,....},
initializer_list:类中由两个指针构成指向开始与结束还有size(),begin(),end()返回迭代器T*---使用直接范围for遍历 vector里支持initializer_list的构造
使用
vectorint v1{1,2,3,4,5,6};
构造拷贝构造
进阶使用
vectorA v1{A(1),{1},{1,2},1};//隐式类型转化构造 八。vector存string的大坑
浅拷贝问题
vectorstring v2;
v2不断push_back,直到insert需要扩容先开新空间再把memcpy原来的拷贝到新的两者都指向了同一块空间再delete[]析构空间没了新空间的相当于野指针了。
解决:拷贝新旧空间时像单个拷贝一样用单个的深拷贝tmp[i]_start[i];
总结在vector里拷贝也要用单个的深拷贝完成整体深拷贝
list与vector的部分区别
1.string,vector是随机迭代器list的不是只支持,--不支持,-,---代价大
2.不支持[]--效率低主流访问方式是迭代器。(_start/范围for)
3.std里的sort要用随机迭代器不能排list---三数取中要支持-
4.多了方法如逆置去重排好序了才能去重相同值挨着也行)值删除list里的sort(归并排序效率贼低不如转为vector再排效率能提升3倍
底层是带头双向循环链表