IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++中的vector基本的数组出现停止工作。 -> 正文阅读

[C++知识库]C++中的vector基本的数组出现停止工作。

今天晚上的主要BUG就是这个,使用的事Devcpp

?? ?vector<int> sV = {1, 2, 3, 3, 2, 1};
?? ?for (vector<int>::iterator iter = sV.begin() + 1; iter != sV.end(); iter++) {
?? ??? ?//本循环从第二个到最后
?? ??? ?for (vector<int>::iterator itery = sV.begin() ; itery != iter; itery++) {
?? ??? ??? ?if ((*itery) == (*iter)) {
?? ??? ??? ??? ?//删除*itery
?? ??? ??? ??? ?auto some = sV.erase(iter);
?? ??? ??? ??? ?cout << *some << endl;
?? ??? ??? ?}
?? ??? ?}
?? ?}

没想到初入STL,也不完全是初入,就遇到这种问题。

使用控制变量法,立马就查出了auto some=sV.erase(iter);这行代码用错了,本来目的是想用来删减掉iter指向的数据,但是明显这样用不行啊。要怎么办?

删除 vector 容器中 pos 迭代器指定位置处的元素,并返回指向被删除元素下一个位置元素的迭代器。该容器的大小(size)会减 1,但容量(capacity)不会发生改变。这样看来似乎是我的参数传错了,只有这种解释比较合乎情理。pos 为指定被删除元素位置的迭代器,同时该函数会返回一个指向删除元素所在位置下一个位置的迭代器。

突然间理解了,这个问题好像是越界,因为按照上面这个逻辑,始终必须返回下一个的话,那么如果我删除的是最后一个必然就会导致最终返回的some越界。

但我觉得vector设计肯定不会设计这么鸡肋的函数erase,否则这样根本就无法删除最后一个元素,删除最后元素始终会越界。但现实是真的这样鸡肋,我必须给erase加一个条件

2021年8月9日21:46:41这儿是真的是一个死循环,如果iter放在for()里面自增,必然会导致erase的时候溢出,而如果放在for循环的大括号里面,那么又很难保证。所以我增加了一个isInrease变量来判断是否递增了。

/*编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
?输入:[1, 2, 3, 3, 2, 1]
?输出:[1, 2, 3]8*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;?

int main() {

?? ?vector<int> sV = {3, 3, 2, 2, 2, 1};
?? ?bool isInrease = false;
?? ?for (vector<int>::iterator iter = sV.begin() + 1; iter != sV.end(); ?) {
?? ??? ?//本循环从第二个到最后
?? ??? ?for (vector<int>::iterator itery = sV.begin() ; itery != iter; itery++) {
?? ??? ??? ?if ((*itery) == (*iter)) {
?? ??? ??? ??? ?//删除*iter
?? ??? ??? ??? ?iter = sV.erase(iter);
?? ??? ??? ??? ?cout << *(iter - 1 ) << endl;
?? ??? ??? ??? ?isInrease = true;
?? ??? ??? ??? ?continue;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?//执行完成了for循环,但这儿并不判断iter是否自增了,所以增加一个isInrease变量
?? ??? ?if (isInrease) {
?? ??? ??? ?isInrease = false;
?? ??? ?} else {
?? ??? ??? ?iter++;
?? ??? ?}

?? ?}

}

当然我把cout里面的内容输出也变成下一个减一。我甚至现在会到过去,会不会是这个问题。

?看来并不会。还是记住这一点,erase给的变量往往是希望作为for循环的变量。因为erase删除之后vector里面的内容发生了变化,这个时候指向被删除的下一个比较可靠。而for循环里面自动加一的话,不稳定。为什么?可以假设一种情况,当iter自增到iter=sV.end()-1,(我假设是5-1)这个时候满足for条件,然后在循环体里面,我把sV里面删去一个,这个时候sV.end的值会变小,变成了4。那么下一个循环体进行比较的时候判断就是iter==sV.end(),就直接跳出循环,但是实际上还差一个元素sV.end()没有进行判断。

另外一种情况,假设iter自增到了sV.end(),这是可能的,虽然我们每次判断都是iter!=sV.end(),但是假设sV.end()=10,iter=9,判断也是满足的,但是满足之后会自增到10.。

? ?所以在这种情况下,sV如果继续删掉一个元素,那么将会导致下一次判断的时候sV.end()!=9 !=10=iter成立。这就直接进入死循环,导致异常情况的发生。

假设改条件嘛,把iter,检查依然会出问题,总之会带来很多不必要的麻烦。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:14:33  更:2021-08-10 13:15:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 19:18:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码