当前位置: 首页 > news >正文

14.vector(上)

第一种情况

第二种情况,如果没有扩容。

本来是想让2*=10,可是却让新插入的*=10;这也算迭代器失效。第一种是野指针,第二种是位置意义已经变了。第二种情况下次你怎么知道什么时候扩容, 

整个设置成模版,库里的还是自己的都可以打,反正都支持迭代器和范围for,不然改成std,好多都要改,很麻烦,

这里访问p数据会报错由于数据挪动,p已经不是指向2了,所以

VS强制检查所以报错。Linux就不报错,可以想象成迭代器默认指向的就是那个值不是地址,值变了,迭代器就失效了。

insert 以后就不要访问了,要访问就得更新迭代器。、

erase不涉及扩容,只涉及挪动数据,挪动数据覆盖我能不能访问这,

VS认为p位置还是失效了

先把std去掉测我们自己的,没啥问题,

void test_vector3(){std::vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);print_container(v);// 删除所有的偶数auto it = v.begin();while (it != v.end()){if (*it % 2 == 0){it = v.erase(it);}else{++it;}}print_container(v);}

这样的话,没删干净,

还会崩溃

第一个先挪动然后++ 就把第二个4跳过了,连续的偶数就不行,第三个挪动覆盖2后,然后++,finish--,删除4 it又会加加,但是erase同时会导致finish--,it不会等于end,然后就断言错误,

insert 或者erase 完了去访问都报错,

看看库里面的:

返回下一个位置,更新一下再访问,不要再随便直接访问,

string也有迭代器失效,string很少用迭代器insert erase ,都用下标。所以没讲。

默认构造构造一个匿名对象然后再去拷贝,编译器优化后就是直接构造,const引用也可以,自定义类型一般都是这样缺省

自定义类型调用它的默认构造,如果T是int,这个T(),为了这种场景(模版)内置类型也有了构造函数的概念了,

0,1,2

void resize(size_t n, T val = T()){if (n < size()){_finish = _start + n;}else{reserve(n);while (_finish < _start + n){*_finish = val;++_finish;}}}

大部分用resize初始化,

加25,3               5就相当于删

库里面的没啥毛病,自己的其实是有问题的,v和v1是指向相同空间的,我们没写构造,给的默认构造,所以我们要把拷贝构造析构写上,这拷贝构造用什么写法现代写法还是什么写法,什么写法好用用什么,

报错说没有构造,构造定义说没写任何构造就会生成构造,写了就不生成,拷贝构造也算构造,构造野生不成了吧, 

这么写就行,写不写初始化列表成员变量会走初始化列表,,内置类型有缺省用缺省,不写不会处理,自定义类型调用默认构造

也可以这么写,强制生成默认构造,  接下来分析一下拷贝构造:

空间不够还要扩容,有消耗

reserve一下给多少都行size caopacity

提前开好空间,pushback没有扩容概念,效率更高了。这里不关注传统写法还是现代,怎么方便怎么来,这也不算传统写法现代写法

这看一下赋值

赋值深拷贝这有一个不二原则:就是现代写法。两个都写一下

		void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);}void clear(){_finish = _start;}// v1 = v3/*vector<T>& operator=(const vector<T>& v){if (this != &v){clear();reserve(v.size());for (auto& e : v){push_back(e);}}return *this;}*/void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);}// v1 = v3//vector& operator=(vector v)vector<T>& operator=(vector<T> v){swap(v);return *this;}

reserve里有检查,相等或者小于就不会。

在类里面可以用类名替代类型,类外面不行,这是特殊的规定。,推荐还是<>,之前说了类名不能代表类型不要搞特殊, 

http://www.dtcms.com/a/619584.html

相关文章:

  • 烟台网站建设开发网站正在建设中永久
  • 快速搭建网站框架图互联网产品运营推广方案
  • Golang学习第一天笔记总结
  • 用jsp实现网站开发实例wordpress去除评论
  • 【Java常用API】-----System 与 标准 I/O流
  • 网站access数据库被攻击不断增大北京市建设投标网站
  • 6.HTTP协议
  • 做网站都有哪些费用网站代备案公司名称
  • 【Chrono库】Chrono DateTime 测试套件解析(src\datetime\tests.rs)
  • 佛山市网站建设哪家好龙岗网站建设哪家好
  • 青岛网站seo分析惠阳网站制作公司
  • 手机网站被禁止访问怎么设置打开怎么做广告宣传最有效
  • 如何跟客户介绍网站建设和推广网站空间位置
  • Python最佳实践:避坑web3.py,稳健gunicorn
  • “状态层同步”是什么,为什么重要,它是怎么工作的
  • 熟悉网站空间 域名等相关知识全球十大搜索引擎入口
  • 什么叫做网站整站微信营销网站(含html源文件)免费下载
  • 佛山市建设企业网站服务机构视频制作软件手机版
  • 济宁专业建网站wordpress首页添加一个超链接框
  • 建站特别慢wordpress建设一网站有什么用
  • 萝岗电子商务网站建设搜索引擎优化有哪些要点
  • 湖南it网站建设mxtia大理工程建设信息网站
  • 金仓数据库 KES:以 “五位一体” 破局,打造融合数据库标杆
  • 三门峡市住房建设局网站网络推广优化seo
  • OSPF协议配置实验报告
  • 江门企业做网站兴义做网站的公司
  • 25年11月软考架构真题《论软件系统的性能测试》考后复盘总结
  • 17zwd一起做网站广州新塘微网站分享功能
  • 高清品牌网站设计建设网站安全制度体系的建设情况
  • 网站设计鉴赏房子装修设计图片大全