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++ vector容器遍历并删除元素 -> 正文阅读

[数据结构与算法]C++ vector容器遍历并删除元素

在使用C++ vector的迭代器遍历并删除元素时,存在一些不注意的误区,这里特此记录。

在使用迭代器遍历vector元素时,错误的删除方法:

  vector<int>::iterator it = vec.begin();
  for (; it != vec.end();) {
    vector<int>::iterator tmpit = it;
    it++;
    vec.erase(tmpit);
  }

正确的删除方法:

  vector<int>::iterator it = vec.begin();
  for (; it != vec.end();) {
    it = vec.erase(it);
  }

一个例子:

  vector<int> vec;
  for (int i = 0; i < 20; ++i) {
    vec.push_back(i + 1);
  }
  for (int i = 0; i < vec.size(); ++i) {
    cout << vec[i] << " ";
  }
  cout << endl;

  vector<int>::iterator it = vec.begin();
  for (; it != vec.end();) {
    cout << (*it) << endl;
    if ((*it) % 2 == 1) {
      vector<int>::iterator tmp = it;
      it = vec.erase(tmp);
    } else {
      it++;
    }
  }

  for (int i = 0; i < vec.size(); ++i) {
    cout << vec[i] << " ";
  }
  cout << endl;

?输出结果为:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1 3 5 7 9 11 13 15 17 19

符合预期!

当使用以上错误的删除方式时,

  vector<int> vec;
  for (int i = 0; i < 20; ++i) {
    vec.push_back(i + 1);
  }
  for (int i = 0; i < vec.size(); ++i) {
    cout << vec[i] << " ";
  }
  cout << endl;

  vector<int>::iterator it = vec.begin();
  for (; it != vec.end();) {
    cout << (*it) << endl;
    if ((*it) % 2 == 0) {
      vector<int>::iterator tmp = it;
      it++;
      vec.erase(tmp);
    } else {
      it++;
    }
  }

  for (int i = 0; i < vec.size(); ++i) {
    cout << vec[i] << " ";
  }
  cout << endl;

输出结果为:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
1
2
4
6
8
10
12
14
16
18
20
20
Segmentation fault

可以看出,迭代器it的访问已经错乱了。

需要说明的是,vector错误的遍历删除方式,在map中是正确的写法!

重要:vector的erase函数会使迭代器失效,因此,在遍历时使用erase函数后,旧的迭代器就不能再使用了!

看下面一个例子:

  vector<int> vec;

  vec.push_back(1);
  vec.push_back(2);

  vector<int>::iterator it = vec.begin();
  for (; it != vec.end();) {
    cout << (*it) << endl;
    if ((*it) % 2 == 1) {
      vector<int>::iterator tmp = it;

      cout << "before erase:" << (*tmp) << endl;

      it = vec.erase(tmp);

      cout << "after erase:" << (*tmp) << endl;

    } else {
      it++;
    }
  }

输出结果为:

1
before erase:1
after erase:2
2

可以看到,erase前的tmp跟it一样,erase之后,tmp并不是旧的it值。

所以万不可在erase之后去访问旧的迭代器!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:22:23  更:2022-05-07 11:25:07 
 
开发: 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年11日历 -2024/11/26 3:54:53-

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