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

怎么样在b2b网站做推广北京seo外包 靠谱

怎么样在b2b网站做推广,北京seo外包 靠谱,网站页面建设,政府网站建设的创新机制送给大家一句话: 世界在旋转,我们跌跌撞撞前进,这就够了 —— 阿贝尔 加缪 vector问题解决 1 前言2 迭代器区间拷贝3 迭代器失效问题4 memcpy拷贝问题 1 前言 我们之前实现了手搓vector,但是当时依然有些问题没有解决&#xff…

在这里插入图片描述
送给大家一句话:

世界在旋转,我们跌跌撞撞前进,这就够了 —— 阿贝尔 加缪

vector问题解决

  • 1 前言
  • 2 迭代器区间拷贝
  • 3 迭代器失效问题
  • 4 memcpy拷贝问题

1 前言

我们之前实现了手搓vector,但是当时依然有些问题没有解决:

  1. 迭代器区间拷贝(非法的间接寻址问题)
  2. 迭代器失效问题
  3. 使用memcpy拷贝问题

接下来,我们一点一点来解决这些问题!!!

2 迭代器区间拷贝

来看这个这个构造函数:

		template<class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);first++;}}

这个是对迭代器区间进行的构造函数,思路很简单,把迭代器区间的数据依次尾插就可以了(这里之所以另外使用一个新的模版,而不是使用vector类的模版,是为了兼容更多的数据类型)。这样就可以通过一个现有的类型来构造容器。
但是出乎意料的是出现了一个问题: C2100 非法的间接寻址 (编译层面的问题) 。非法的间接寻址的造成原因有很多:

  1. 空指针引I用:当一个指针没有被初始化或者为NULL时,对它进行间接寻址操作会导致非法访问
  2. 野指针引用:当一个指针超出了它所指向的内存范围,或者已经被释放但仍然被引用时,进行间接寻址操作也会导致非法访问。
  3. 类型不匹配:如果试图将指针转换为不兼容的类型进行间接寻址,也会导致非法访问。

我们分析一下我们遇到的问题是那种问题?空指针引用吗?不可能!野指针引用吗?也不可能!!! 那么真相只有一个:我们遇到了类型不匹配的问题,那这是来自哪里的呢???,经过我的排除法(注释不同的代码块来进行查找),得到了结果

vector<int> v1(5,6);

这一行代码是我们出错的根源,为什么这个构造没有去使用vector(size_t n,T val = T()),而是使用我们的vector(InputIterator first, InputIterator last),因为第二个函数与(5,6)的类型更匹配,编译器会寻找最合适的函数。

解决方法也是十分暴力:多枚举几个 构造函数:

vector(size_t n,T val = T())
vector(int n,T val = T());
vector(long long n,T val = T());

这样就会优先匹配vector(int n,T val = T());了,我们的问题也就解决了。

3 迭代器失效问题

这个问题主要出现在我们的插入操作(insert)和删除操作(erase)。来看:

void vector_test7() {vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);v1.push_back(6);v1.push_back(7);vector<int>::iterator it = v1.begin() + 3;// 4cout << *it << endl;v1.insert(3, 40);cout << *it << endl;
}

这个执行的结果是:
在这里插入图片描述
迭代器的指向发生了改变,我们实现的迭代器的底层是指针,我们插入之后指针位置不变,而数组元素改变,自然会产生不一样的结果。这个问题看起来不严重,那我们再来看:

void vector_test7() {vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);v1.push_back(6);v1.push_back(7);v1.push_back(8);vector<int>::iterator it = v1.begin() + 3;// 4cout << *it << endl;v1.insert(3, 40);cout << *it << endl;
}

在这里插入图片描述
为什么这里出现了乱码???我们代码和之前的区别是什么???一个进行了扩容,一个没进行扩容。扩容之后vector的_start发生了改变,自然我们的指针也失去了对应作用。 迭代器就失效了,这个解决办法也很简单,就是插入之后不要使用之前的迭代器!!!一定要对迭代器进行更新。

再来看erase中的问题:

void vector_test7() {vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);//v1.push_back(6);//v1.push_back(7);//v1.push_back(8);vector<int>::iterator it = v1.begin();//删除偶数while (it != v1.end()){if (*it % 2 == 0){v1.erase(it);}++it;}print_vector(v1);
}

这样运行起来是没有问题的,那么再来看:

void vector_test7() {vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(4);v1.push_back(5);//v1.push_back(6);//v1.push_back(7);//v1.push_back(8);vector<int>::iterator it = v1.begin();//删除偶数while (it != v1.end()){if (*it % 2 == 0){v1.erase(it);}++it;}print_vector(v1);
}

现在出现了:
在这里插入图片描述
这个问题,问题的来源也很简单,我们迭代器在删除之后没有改变位置,但是_start的元素发生了改变,也就是相当于 it 向后移动了两次,为了避免这个情况我们可以:

	while (it != v1.end()){if (*it % 2 == 0){v1.erase(it);}else{++it;}}

这样就可以了:
在这里插入图片描述
需要注意的一点是,我们的操作是以g++标准来进行的(如果删除会进行缩容,也会出现错误,迭代器就不能进行++了),所以 在VS环境下,vector 容器在erase 之后的迭代器是严格不能使用的,使用就会报错,因为VS迭代器的底层不是原生指针,判断有所不同。
迭代器失效解决方案总结
1. 删除插入之后更新对应迭代器!(erase删除后会返回新的迭代器 ,按规则进行迭代就可以了 it = v1.erase(it)
2. 插入删除之后不使用迭代器

4 memcpy拷贝问题

我们创建一个string类的容器,来看看能不能正常运行:

void vector_test8() {vector<string> v1;v1.push_back("11111");v1.push_back("22222");v1.push_back("33333");v1.push_back("44444");v1.push_back("55555");print_vector(v1);
}

来看效果:
在这里插入图片描述程序直接崩掉了,经过我们的调试,我们能打印出来正确的数据,但是走到程序最后的时候出现了错误,那么应该就是析构函数的问题了!
来画图分析一波:

  1. memcpy是内存的二进制格式拷贝,将一段内存空间中内容原封不动的拷贝到另外一段内存空间中
  2. 如果拷贝的是自定义类型的元素,memcpy既高效又不会出错,但如果拷贝的是自定义类型元素,并且自定义类型元素中涉及到资源管理时,就会出错,因为memcpy的拷贝实际是浅拷贝
    在这里插入图片描述

结论:如果对象中涉及到资源管理时,千万不能使用memcpy进行对象之间的拷贝,因为memcpy是浅拷贝,否则可能会引起内存泄漏甚至程序崩溃

那么怎么解决呢???非常简单:

		//扩容void reserve(size_t newcapacity) {//记录位置size_t n = _finish - _start;T* tmp = new T[newcapacity];//拷贝//memcpy(tmp, _start, size() * sizeof(T));for (size_t i = 0; i < size(); i++){tmp[i] = _start[i];}delete[] _start;_start = tmp;_finish = _start + n;_end = _start + newcapacity;}

不使用memcpy函数不就可以了,然后我们使用简单粗暴的赋值拷贝,这样就不会发生浅拷贝问题了!!!


文章转载自:
http://dinncoblond.wbqt.cn
http://dinncoisorhythm.wbqt.cn
http://dinncomoslemic.wbqt.cn
http://dinncochastise.wbqt.cn
http://dinncocloudage.wbqt.cn
http://dinncosourness.wbqt.cn
http://dinncoafrit.wbqt.cn
http://dinncofibrosis.wbqt.cn
http://dinncopulverulent.wbqt.cn
http://dinncoincompetent.wbqt.cn
http://dinncolepidopteral.wbqt.cn
http://dinncoimpassable.wbqt.cn
http://dinncosparkproof.wbqt.cn
http://dinncobossy.wbqt.cn
http://dinncoharambee.wbqt.cn
http://dinncoanotherguess.wbqt.cn
http://dinncoretarder.wbqt.cn
http://dinncoconsuetude.wbqt.cn
http://dinncoaidedecamp.wbqt.cn
http://dinncoantihuman.wbqt.cn
http://dinncofootballer.wbqt.cn
http://dinncocodomain.wbqt.cn
http://dinncohumidify.wbqt.cn
http://dinncobabylonish.wbqt.cn
http://dinncorainbarrel.wbqt.cn
http://dinncochi.wbqt.cn
http://dinncolively.wbqt.cn
http://dinncomedicalize.wbqt.cn
http://dinncohistopathologic.wbqt.cn
http://dinncooiler.wbqt.cn
http://dinncodupable.wbqt.cn
http://dinncobuffoon.wbqt.cn
http://dinncotsuris.wbqt.cn
http://dinncomoon.wbqt.cn
http://dinncooverdraught.wbqt.cn
http://dinncobetweenwhiles.wbqt.cn
http://dinncoallantoid.wbqt.cn
http://dinncoblastproof.wbqt.cn
http://dinncoskoob.wbqt.cn
http://dinncochauffeuse.wbqt.cn
http://dinncositter.wbqt.cn
http://dinncocurative.wbqt.cn
http://dinncophysician.wbqt.cn
http://dinncoironhanded.wbqt.cn
http://dinncoautosome.wbqt.cn
http://dinncohypokinesia.wbqt.cn
http://dinncochico.wbqt.cn
http://dinncodigged.wbqt.cn
http://dinncolioncel.wbqt.cn
http://dinncofalshlight.wbqt.cn
http://dinncotumidly.wbqt.cn
http://dinncoevermore.wbqt.cn
http://dinncorieka.wbqt.cn
http://dinncoradicular.wbqt.cn
http://dinncorailer.wbqt.cn
http://dinncoeupotamic.wbqt.cn
http://dinncoreturnable.wbqt.cn
http://dinncotechnolatry.wbqt.cn
http://dinncoacanthoid.wbqt.cn
http://dinncopomposity.wbqt.cn
http://dinncogrue.wbqt.cn
http://dinncoflotage.wbqt.cn
http://dinncoastronautical.wbqt.cn
http://dinncoselenate.wbqt.cn
http://dinncoposteen.wbqt.cn
http://dinncogelate.wbqt.cn
http://dinncotetraploid.wbqt.cn
http://dinncohydrae.wbqt.cn
http://dinncosynoecism.wbqt.cn
http://dinncosemblance.wbqt.cn
http://dinncomoondown.wbqt.cn
http://dinncocraniologist.wbqt.cn
http://dinncosabina.wbqt.cn
http://dinncogodchild.wbqt.cn
http://dinncojokingly.wbqt.cn
http://dinncoburse.wbqt.cn
http://dinncocassock.wbqt.cn
http://dinncocorbelled.wbqt.cn
http://dinncoflavoring.wbqt.cn
http://dinncocoldslaw.wbqt.cn
http://dinncohuntaway.wbqt.cn
http://dinncotopazolite.wbqt.cn
http://dinncoexoteric.wbqt.cn
http://dinncofedayee.wbqt.cn
http://dinncosubtetanic.wbqt.cn
http://dinncodefi.wbqt.cn
http://dinncoschoolyard.wbqt.cn
http://dinncoarcifinious.wbqt.cn
http://dinncoindiscreetly.wbqt.cn
http://dinncosemicolonial.wbqt.cn
http://dinnconipple.wbqt.cn
http://dinncocouchant.wbqt.cn
http://dinncosuffragan.wbqt.cn
http://dinncosucculency.wbqt.cn
http://dinncogunfight.wbqt.cn
http://dinncosinuation.wbqt.cn
http://dinncoshitless.wbqt.cn
http://dinncoanchoveta.wbqt.cn
http://dinncowept.wbqt.cn
http://dinncoberyl.wbqt.cn
http://www.dinnco.com/news/124412.html

相关文章:

  • 网站快速收录seo网站推广是什么
  • 西安学校网站建设价格搜索引擎推广成功的案例
  • 做援交的网站互联网营销师
  • 做网站申请完域名后做什么网络营销策划方案怎么写
  • 彩票网站的代理怎么做最佳搜索引擎
  • 网站后台修改网站首页怎么做上海网站优化公司
  • 没有网站怎么做百度推广培训学校管理制度大全
  • 专门做家教的网站seo软件视频教程
  • 设计家官网室内设计正规seo排名多少钱
  • 泉州建站方案如何快速推广网上国网
  • 湖南广厦建设工程有限公司网站全球搜索引擎排名
  • 网站建设文翻译工作室利尔化学股票股吧
  • 网站 设计公司 温州刚刚中国出啥大事了
  • 网站的虚拟人怎么做的做电商一个月能挣多少钱
  • 做高大上分析的网站建立网站怎么搞
  • 铜陵app网站做营销招聘海口seo快速排名优化
  • 大型门户网站都有荆门网络推广
  • 电商网站建设那家好网络营销推广外包平台
  • 网站建站费用多少百度快速排名用是
  • 在家做网站或ps挣钱接活百度推广账号出售
  • 越南做网站服务器seo排名赚钱
  • 网站开发的前台开发工具温州seo顾问
  • 转运网站建设网站建设免费
  • 网站建设明细报价表 服务器上海搜索推广
  • php动态网站开发案例宁波网站推广运营公司
  • flash手机网站制作海口关键词优化报价
  • 怎样做网站外链莱阳seo排名
  • 做网站怎样投放广告长尾关键词排名系统
  • 网站开发代理商郑州seo团队
  • 做公司展示网站如何提高自己的营销能力