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

兰州做网站企业长春seo代理

兰州做网站企业,长春seo代理,广州有哪些旅游景点比较出名,wordpress 添加关键字vector迭代器的失效问题 接上篇vector的介绍和使用中最后提到的vector迭代器&#xff0c;我们继续来看vector迭代器的失效问题。 以下代码的功能是删除vector中所有的偶数&#xff0c;请问那个代码是正确的&#xff0c;为什么&#xff1f; #include <iostream> using na…

vector迭代器的失效问题

接上篇vector的介绍和使用中最后提到的vector迭代器,我们继续来看vector迭代器的失效问题。

以下代码的功能是删除vector中所有的偶数,请问那个代码是正确的,为什么?
#include <iostream>
using namespace std;
#include <vector>
//第一种方法
int main()
{vector<int> v{ 1, 2, 3, 4 };auto it = v.begin();while (it != v.end()){if (*it % 2 == 0)v.erase(it);++it;}return 0;
}
//第二种方法
int main()
{vector<int> v{ 1, 2, 3, 4 };auto it = v.begin();while (it != v.end()){if (*it % 2 == 0)it = v.erase(it);else++it;}return 0;
}

        答案是第二种,第一种的方法会导致迭代器失效,因为每删除一个,erase迭代器后就不让使用了,而第二种方法在 it = v.erase(it)中解决了,因为erase函数会返回删除元素的下一个位置的迭代器,解决乐迭代器失效的问题。

Linux下g++编译器对迭代器失效的检测

        Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端。以下三种情况可以让我们对Linux下g++迭代器失效情况更加了解
// 1. 扩容之后,迭代器已经失效了,程序虽然可以运行,但是运行结果已经不对了
int main()
{vector<int> v{1,2,3,4,5};for(size_t i = 0; i < v.size(); ++i)cout << v[i] << " ";cout << endl;auto it = v.begin();cout << "扩容之前,vector的容量为: " << v.capacity() << endl;// 通过reserve将底层空间设置为100,目的是为了让vector的迭代器失效 v.reserve(100);cout << "扩容之后,vector的容量为: " << v.capacity() << endl;// 经过上述reserve之后,it迭代器肯定会失效,在vs下程序就直接崩溃了,但是linux下不会// 虽然可能运行,但是输出的结果是不对的while(it != v.end()){cout << *it << " ";++it;}cout << endl;return 0;
}
程序输出:
1 2 3 4 5
扩容之前,vector的容量为: 5
扩容之后,vector的容量为: 100
0 2 3 4 5 409 1 2 3 4 5
// 2. erase删除任意位置代码后,linux下迭代器并没有失效
// 因为空间还是原来的空间,后序元素往前搬移了,it的位置还是有效的
#include <vector>
#include <algorithm>
int main()
{vector<int> v{1,2,3,4,5};vector<int>::iterator it = find(v.begin(), v.end(), 3);v.erase(it);cout << *it << endl;while(it != v.end()){cout << *it << " ";++it;}cout << endl;return 0;
}程序可以正常运行,并打印:
4
4 5
// 3: erase删除的迭代器如果是最后一个元素,删除之后it已经超过end
// 此时迭代器是无效的,++it导致程序崩溃
int main()
{vector<int> v{1,2,3,4,5};// vector<int> v{1,2,3,4,5,6};auto it = v.begin();while(it != v.end()){if(*it % 2 == 0)v.erase(it);++it;}for(auto e : v)cout << e << " ";cout << endl;return 0;
}
========================================================
// 使用第一组数据时,程序可以运行
[sly@VM-0-3-centos 20220114]$ g++ testVector.cpp -std=c++11
[sly@VM-0-3-centos 20220114]$ ./a.out
1 3 5
=========================================================
// 使用第二组数据时,程序最终会崩溃
[sly@VM-0-3-centos 20220114]$ vim testVector.cpp
[sly@VM-0-3-centos 20220114]$ g++ testVector.cpp -std=c++11
[sly@VM-0-3-centos 20220114]$ ./a.out
Segmentation fault
        从上述三个例子中可以看到:SGI STL中,迭代器失效后,代码并不一定会崩溃,但是运行结果肯定不对,如果it不在begin和end范围内,肯定会崩溃的。

与vector类似,string在插入+扩容操作+erase之后,迭代器也会失效

#include <string>
void TestString()
{string s("hello");auto it = s.begin();// 放开之后代码会崩溃,因为resize到20会string会进行扩容// 扩容之后,it指向之前旧空间已经被释放了,该迭代器就失效了// 后序打印时,再访问it指向的空间程序就会崩溃//s.resize(20, '!');while (it != s.end()){cout << *it;++it;}cout << endl;it = s.begin();while (it != s.end()){it = s.erase(it);// 按照下面方式写,运行时程序会崩溃,因为erase(it)之后// it位置的迭代器就失效了// s.erase(it); ++it;}
}

迭代器失效解决办法:在使用前,对迭代器重新赋值即可。

vector常见oj题

1.只出现一次的数字 - 力扣

class Solution {
public:int singleNumber(vector<int>& nums) {int value = 0;for(auto e : nums){value ^= e;}return value;}
};

2.杨辉三角- 力扣(LeetCode) 

 

class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> vv;vv.resize(numRows);for(size_t i=0;i<numRows;i++){vv[i].resize(i+1,0);vv[i][0]=vv[i][vv[i].size()-1]=1;}if(numRows<=2)return vv;for(size_t i =2;i<numRows;i++){for(size_t j=1;j<i;j++){vv[i][j]=vv[i-1][j-1]+vv[i-1][j];}}return vv;}
};

 总结:通过上面的练习我们发现vector常用的接口更多是插入和遍历。遍历更喜欢用数组operator[i]的形式访问,因为这样便捷。

http://www.wooajung.com/news/29845.html

相关文章:

  • pyhton做网站热点新闻事件
  • 帮人做彩票网站支付接口百度公司图片
  • 如何看访问网站的dns粤语seo是什么意思
  • 网站模板自助重庆seo研究中心
  • 网站开发维护合同样板游戏合作渠道
  • 手机网站搭建教程百度应用app下载
  • 网站数据统计项目推广网
  • 类似于kobas的网站做kegg分析阿里云官网首页
  • wordpress get_comments购买seo关键词排名优化官网
  • 做网站如何屏蔽中国的ip网络营销策略研究论文
  • app 与网站沈阳网站关键词优化多少钱
  • 网站建设推广费怎么做账宁波seo搜索平台推广专业
  • 最新仿5173游戏装备交易网站 游戏币交易平台源码整合支付接口seo推广代运营
  • 深圳 商城 网站建设手机百度推广怎么打广告
  • 公司注册地址可以跨市迁移吗seo优化信
  • 电影网站做流量成都seo的方法
  • 做网站能力介绍搜狗关键词排名此会zjkwlgs
  • 服务器上怎做网站潍坊seo推广
  • wordpress上百度吗广州谷歌seo
  • 昆明做烤瓷牙哪去柏德L网站黑帽seo教程
  • 网上找兼职的网站超级外链
  • 专业网站制作公司网上推广平台
  • 商城网站开发视频教程seo优化易下拉霸屏
  • 毕业设计做app还是做网站好的seo网站
  • 网站系统目前运行稳定网络营销推广方案ppt
  • 寻找销售团队外包上海百度seo点击软件
  • 网站维护的主要工作宁波seo整体优化
  • 在服务器做网站百度关键词检测工具
  • 泛微oa手机版四川seo关键词工具
  • 公司网站网址注册和备案哪里找可以免费发广告的网站有哪些