0

0

c++中如何删除数组指定元素_c++移动元素实现删除【技巧】

穿越時空

穿越時空

发布时间:2026-03-12 14:39:31

|

711人浏览过

|

来源于php中文网

原创

std::remove+erase组合才是真删除:std::remove仅重排元素并返回新逻辑终点,不改变容器大小;必须配合erase才能完成物理删除,否则内存未释放、长度不变。

c++中如何删除数组指定元素_c++移动元素实现删除【技巧】

std::remove + erase 组合才是真删除

直接用 std::remove 不会删掉元素,它只是把要删的元素“挤到末尾”,返回一个新逻辑终点迭代器。不配合容器的 erase,数组/容器长度根本不变,内存也没释放。

  • std::remove 只重排,不改变容器大小;vector.erase(remove(...), end()) 才算完成物理删除
  • 对原生数组(如 int arr[10])无法直接用 erase,得手动记录新长度,或改用 std::vector
  • 如果用 std::remove_if,谓词里别修改容器,否则迭代器失效——常见于边遍历边 push_back

原生数组删元素只能靠“覆盖+长度管理”

没有运行时长度信息的 C 风格数组,删一个元素本质是:把后面所有元素往前挪一位,再维护一个有效长度变量。不存在“缩容”这回事。

  • 不能写 delete[] arr[i] —— delete[] 是针对整个数组分配的指针,不是单个元素
  • 若用 memmove(arr + i, arr + i + 1, (len - i - 1) * sizeof(int)),注意第三个参数是字节数,别漏 sizeof
  • 手写循环移动时,必须从前往后复制(即 arr[j] = arr[j+1]),否则同一元素被反复覆盖

std::vector::erase 删除单个元素的坑

调用 vec.erase(it) 后,it 立即失效,且其后所有迭代器、引用、指针都可能失效(尤其在容量缩小时)。这不是警告,是必现行为。

百宝箱
百宝箱

百宝箱是支付宝推出的一站式AI原生应用开发平台,无需任何代码基础,只需三步即可完成AI应用的创建与发布。

下载
  • 不要在 for 循环里边删边 ++it:for (auto it = v.begin(); it != v.end(); ++it) 遇到 erase 就崩
  • 安全写法是 it = v.erase(it),它返回下一个有效迭代器;或者倒序索引删除:for (int i = v.size()-1; i >= 0; --i)
  • 删除多个匹配项时,别反复调用 erase——每次都会搬动后续元素,O(n²);坚持用 remove + erase

std::spanstd::array 时不能删元素

std::span 是视图,std::array 是固定大小栈数组,两者都不支持增删。试图“删”只是逻辑上忽略某段,实际内存布局完全不变。

立即学习C++免费学习笔记(深入)”;

  • std::span 可以用 subspan 截取不含目标元素的部分,但原数据没变,也不影响原始容器
  • std::array 没有 erase 成员函数,连 remove 都得配合 std::begin/std::end 手动传迭代器
  • 如果真需要动态删,别硬扛——换 std::vector,哪怕只删一两次,也比自己模拟长度管理更可靠

C++ 里“删除数组元素”这件事,核心分歧不在语法,而在你用的是哪种“数组”:原生数组没长度、std::array 不能变长、std::vector 才真正支持逻辑+物理删除。选错类型,后面所有技巧都是补丁。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1030

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

611

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.2万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号