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

做创意ppt网站有哪些广告公司推广文案

做创意ppt网站有哪些,广告公司推广文案,有什么网站做微商,哪个公司的网站做的好. 💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 文章目录 一、引言二、reserve 扩容引发的迭代器失效2.1 问题现象2.2 正确实现 三、insert 插入引发的…

.

💓 博客主页:倔强的石头的CSDN主页
📝Gitee主页:倔强的石头的gitee主页
⏩ 文章专栏:《C++指南》
期待您的关注
在这里插入图片描述

文章目录

    • 一、引言
    • 二、reserve 扩容引发的迭代器失效
      • 2.1 问题现象
      • 2.2 正确实现
    • 三、insert 插入引发的迭代器失效
      • 3.1 问题现象
      • 3.2 正确实现
    • 四、erase 删除引发的迭代器失效
      • 4.1 问题现象
      • 4.2 正确实现
      • 4.3 编译器行为对比
    • 五、结尾总结

一、引言

在 C++ 容器开发中,迭代器失效问题是影响程序稳定性的常见痛点。
本文将结合上一篇文章自主实现的 vector类,针对 reserveinserterase 三种操作引发的迭代器失效问题展开深入分析,并提供完整的解决方案。

前文回顾:
【C++指南】vector(一):从入门到详解
【C++指南】vector(二):手把手教你底层原理与模拟实现

二、reserve 扩容引发的迭代器失效

2.1 问题现象

reserve 触发扩容时,容器会重新分配内存,导致原有迭代器失效。错误实现如下:

// 错误示范 1
void reserve(size_t n)
{if (n > capacity()) {T* tmp = new T[n];memcpy(tmp, _start, sizeof(T) * size()); // 浅拷贝问题delete[] _start;_start = tmp;_finish = _start + size(); // 此时_start已改变,size()计算错误_endofstorage = _start + n;}
}

核心问题

  1. memcpy 导致自定义类型浅拷贝
  2. 扩容后 _start 指针变化,size() 返回错误值

2.2 正确实现

void reserve(size_t n)
{if (n > capacity()) {size_t old_size = _finish - _start; // 提前记录有效元素数量T* tmp = new T[n];// 深拷贝元素(支持自定义类型)for (size_t i = 0; i < old_size; ++i) {tmp[i] = _start[i];}delete[] _start;_start = tmp;_finish = _start + old_size; // 使用预存的old_size_endofstorage = _start + n;}
}

解决思路

  1. 提前记录有效元素数量 old_size
  2. 逐个元素赋值实现深拷贝
  3. 使用预存的 old_size 更新 _finish

三、insert 插入引发的迭代器失效

3.1 问题现象

插入操作可能触发扩容,导致传入的迭代器 pos 失效:

// 错误示范
void insert(iterator pos, const T& val)
{if (_finish == _endofstorage) {reserve(2 * capacity()); // 扩容后pos失效}// ... 元素移动逻辑
}

核心问题:扩容后 pos 指向原内存空间,导致后续操作错误

3.2 正确实现

void insert(iterator pos, const T& val)
{if (_finish == _endofstorage) {size_t offset = pos - begin(); // 记录相对偏移量reserve(2 * capacity());pos = begin() + offset; // 重新定位迭代器}// ... 元素移动逻辑
}

解决思路

  1. 扩容前计算 posbegin() 的相对距离
  2. 扩容后通过新 begin() 重建有效迭代器

四、erase 删除引发的迭代器失效

4.1 问题现象

删除元素后,被删除位置的迭代器仍然指向原内存,但内容已改变:

// 错误示范
void erase(iterator pos)
{// ... 元素前移逻辑--_finish;
}

错误后果:后续访问 pos 会导致未定义行为

4.2 正确实现

iterator erase(iterator pos)
{// ... 元素前移逻辑--_finish;return pos; // 返回当前迭代器(需配合编译器行为处理)
}

解决策略

  1. 使用返回的迭代器继续操作
  2. 注意不同编译器的行为差异:
    • g++:允许访问已删除位置(除非越界)
    • VS:严格检查,访问即报错

4.3 编译器行为对比

vector<int> v = {1, 2, 3};
auto it = v.begin() + 1;
v.erase(it);
cout << *it << endl; // g++输出随机值,VS直接报错

五、结尾总结

操作类型失效原因解决方案
reserve内存重分配导致指针变化预存有效元素数量
insert扩容后迭代器定位错误记录相对偏移量
erase元素移动导致内容改变使用返回的迭代器

开发建议

  1. 避免在可能触发扩容的操作后直接使用原有迭代器
  2. 优先使用标准库 erase 的返回值
  3. 在性能敏感场景,提前计算容量避免频繁扩容
  4. 自定义容器时,严格遵循迭代器失效规则

提示:迭代器失效问题本质上是内存管理问题。建议在复杂操作前后通过 begin() 重建迭代器,或使用 reverse_iterator 辅助处理。对于高并发场景,考虑使用 std::vector 的线程安全增强版本。

本文完

http://www.dtcms.com/wzjs/74845.html

相关文章:

  • 西安关键词seo公司廊坊seo优化
  • 客服平台系统网络优化主要做什么
  • 专业地推团队鹤壁seo推广
  • 单位服务器网站打不开做一个网站的步骤
  • 网站建设越来越注重用户体验免费关键词挖掘工具
  • 网站开发总跳转至404页面发布外链的步骤
  • 乌鲁木齐网站制作公司可靠吗河南企业网站建设
  • 天津建设网网站打不开网络营销比较好的企业
  • 榆林高端网站建设如何设计网站建设优化的技巧
  • 做平面设计的网站哈尔滨网络优化公司有哪些
  • 如何做一个个人做网站阿里指数在线查询
  • 东莞网站建设属于什么专业给公司做网站的公司
  • 做海外市场什么网站推广seo类目链接优化
  • 创新的成都 网站建设长沙seo搜索
  • 郴州做网站营销软件有哪些
  • 动态网站建设与管理域名注册需要多少钱
  • 网站水印怎么做的网站查询器
  • 网站做seo的好处游戏推广赚钱
  • 珠海网站建设公司怎样打百度人工客服热线
  • 知名网站建设是哪家便宜推广普通话手抄报内容怎么写
  • 购物平台排名淘宝seo软件
  • 做网站赌博的推广是不是犯罪的短视频培训课程
  • b2c平台网站成都搜索优化整站优化
  • wap手机网站代码百度资源搜索
  • 如何做一个网站代码网络营销的推广手段
  • wordpress免费企业青岛官网优化
  • 山东建设工程执业证书查询网站广告投放平台有哪些
  • 没有公司网站如何做推广优化seo软件
  • 网站备案连接怎么做如何让百度收录
  • 网站建设 中企动力医院重庆网站建设与制作