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

阿里巴巴怎么做网站无锡百度竞价推广

阿里巴巴怎么做网站,无锡百度竞价推广,网站快速收录提交,wordpress 后台输入表格有框_预览没有边框. 💓 博客主页:倔强的石头的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/90938.html

相关文章:

  • dede做视频网站广州现在有什么病毒感染
  • 做静态网站接单个人网页生成器
  • 怎么让自己的电脑做网站服务器爱站网长尾关键词挖掘
  • 成都sw网站建设seo机构
  • 出口外贸网站建设seo搜索排名影响因素主要有
  • 盘锦建网站关键词优化推广公司排名
  • 没有网站可以做cpc吗杭州seo公司哪家好
  • 外贸网站建设 三方登录营销策划公司名称
  • 做外贸网站公司哪家网络营销的六大特征
  • 购物网站开发实例百度大全免费下载
  • 建设银行网站 开户行怎么查苏州网站建设书生
  • 山东集团网站建设b站刺激战场视频
  • 阿里巴巴国际站怎么注册域名查询ip
  • 拉萨工商做年检网站长沙网站制作
  • 嵊州网站百度高级搜索引擎入口
  • ps切片做网站域名访问网站入口
  • 东莞市网络策划推广哪家好长沙官网优化公司
  • 网站中的轮播怎么做刷排名的软件是什么
  • 网销具体怎么做网站下载百度软件
  • 软件工程名词解释seo检测
  • 赣州网站建设如何最新热点新闻事件
  • 做网站应该会什么问题百度搜索风云榜电视剧
  • 做暧暧视频免费视频日韩网站app推广方案策划
  • 网站建设是平面设计吗数据分析工具
  • 网站建设步骤 教 程如何实施网站推广
  • 成都网站建设工作百度图片识别在线使用
  • 生成网站有吗免费的外链seo招聘
  • 低价网站建设行业现状武汉网站开发公司
  • 做分子生物实验常用网站百度的营销中心上班怎么样
  • 网页.网站.主页.网址.域名有什么联系除了91还有什么关键词