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

C++ 特性之vector详解 + 联合opencv使用

C++ 特性之vector详解 + 联合opencv使用

在C++中,遍历vector并删除元素需要小心处理迭代器失效的问题。通常推荐的方法是使用迭代器进行遍历,并在需要删除元素时使用erase函数。这里给出一个示例代码,演示如何安全地遍历vector并删除特定条件的元素:

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9};// 遍历vector,并删除偶数for (auto it = vec.begin(); it != vec.end(); /* 注意:不在此处增加it */ ) {if (*it % 2 == 0) {it = vec.erase(it); // erase会返回下一个有效的迭代器} else {++it; // 只有在不删除元素时才移动迭代器}}// 输出剩余的元素for (auto num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

在这里插入图片描述
在C++中,std::vector 是一种非常灵活的容器,允许你存储任意类型的动态数组。然而,std::vector 本身并不直接提供一个名为 “删除元素” 的成员函数。不过,你可以使用几种不同的方法来从 vector 中移除元素。

  1. 使用 erase 和 remove(或 remove_if)
    这是移除元素最常见的方法,它结合了算法库中的 remove(或 remove_if,如果你基于条件移除)和 vector 的 erase 成员函数。remove(或 remove_if)将需要删除的元素移动到容器的末尾,并返回一个迭代器指向新逻辑末尾(即最后一个未被移除的元素之后的位置),然后你可以使用 erase 来实际删除这些元素。
#include <vector>  
#include <algorithm> // 包含 remove 和 remove_if  std::vector<int> vec = {1, 2, 3, 4, 5, 2, 2, 7};  // 移除所有值为 2 的元素  
vec.erase(std::remove(vec.begin(), vec.end(), 2), vec.end());  // 或者,使用 lambda 表达式和 remove_if 移除所有偶数  
vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i){ return i % 2 == 0; }), vec.end());
  1. 直接访问并删除
    如果你知道要删除的元素的确切位置,可以直接使用 erase 来删除它。但请注意,这只会删除一个元素,并且你需要确保索引是有效的。
std::vector<int> vec = {1, 2, 3, 4, 5};  // 假设我们要删除索引为 2 的元素(即值为 3 的元素)  
vec.erase(vec.begin() + 2);
  1. 清除整个容器
    如果你想删除容器中的所有元素,可以简单地使用 clear 成员函数。
std::vector<int> vec = {1, 2, 3, 4, 5};  
vec.clear(); // 现在 vec 是空的

注意事项
使用 erase 时,由于它会改变容器的大小并可能使迭代器失效,因此务必小心处理迭代器。在 erase 操作后,所有指向被删除元素(包括被删除元素之后的所有元素)的迭代器、指针和引用都将变得无效。
remove 和 remove_if 函数并不实际删除元素,它们只是将不需要的元素移动到容器的末尾,并返回一个迭代器指向新逻辑末尾的位置。你需要配合 erase 来实际删除这些元素。
当使用基于范围的 for 循环时,由于迭代器可能会失效,因此不适合直接在循环体中使用 erase(除非你能确保不会删除当前迭代器指向的元素)。在这种情况下,你可以考虑使用上述的 erase-remove 惯用法或使用索引进行迭代。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据库方式实现实时排行榜
  • http参数污染利用php小特性绕过贷齐乐waf
  • Dom 元素转换 Image 图片 (截图)
  • 探索PHP的心脏:流行CMS系统全解析
  • KillWxapkg 自动化反编译微信小程序,小程序安全评估工具,发现小程序安全问题,自动解密,解包,可还原工程目录,支持修改Hook,小程序
  • html复习
  • 大语言模型面试宝典:30+ 必考问题与答案,助你一臂之力
  • 关于100个linux常用的命令
  • 2-63 基于matlab的GMPHD滤波器算法
  • 互联网摸鱼日报(2024-08-13)
  • Java Nacos与Gateway的使用
  • 【一文搞懂】Rewind AI是什么?Rewind AI能干嘛?全网最全指南!
  • Web自动化测试:UI自动化框架结构以及思路!
  • 【机器学习之深度学习】深度学习和机器学习的关系以及深度学习的应用场景
  • PHP、JavaScript代码审计工具
  • [译]前端离线指南(上)
  • CSS盒模型深入
  • ES6核心特性
  • extjs4学习之配置
  • gcc介绍及安装
  • git 常用命令
  • Java比较器对数组,集合排序
  • laravel5.5 视图共享数据
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • SpiderData 2019年2月13日 DApp数据排行榜
  • springboot_database项目介绍
  • Swift 中的尾递归和蹦床
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 产品三维模型在线预览
  • 力扣(LeetCode)22
  • 树莓派 - 使用须知
  • 算法-插入排序
  • 小程序测试方案初探
  • 学习使用ExpressJS 4.0中的新Router
  • 白色的风信子
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • $forceUpdate()函数
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (6)添加vue-cookie
  • (AngularJS)Angular 控制器之间通信初探
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)PySpark3:SparkSQL编程
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (生成器)yield与(迭代器)generator
  • (转)为C# Windows服务添加安装程序
  • .NET DataGridView数据绑定说明
  • .NET MVC第三章、三种传值方式
  • .net 连接达梦数据库开发环境部署
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET8使用VS2022打包Docker镜像