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

vector模拟实现中的迭代器失效问题

首先来看一组代码:
 

iterator insert(iterator pos, const T& x)
{// 扩容if (_finish == _end_of_storage){size_t len = pos - _stare;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _stare + len;}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;--end;}*pos = x;++_finish;return pos;
}

这是关于实现insert函数的一组代码。对pos迭代器指向的位置进行插入数据。现在给出一组测试用例:
 

void test_vector2()
{std::vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);Cao::print_container(v);/*v.insert(v.begin() + 2, 30);print_vector(v);*/int x;cin >> x;auto p = find(v.begin(), v.end(), x);if (p != v.end()){p = v.insert(p, 40);(*(p + 1)) *= 10;}Cao::print_container(v);
}

来看运行结果:
p本来指向的是1的位置,但是现在却是40乘10,这就是因为迭代器失效的原因。当进行insert插入之后返回的迭代器已经不指向原来的位置。所以对insert插入之后的pos迭代器进行操作就会引起指向错误。所以得出,经过insert之后的迭代器就会失效。不要直接进行访问。如若访问,一定要更新失效的迭代器之后在进行访问。 

修改后的代码:

void test_vector2()
{std::vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);Cao::print_container(v);int x;cin >> x;auto p = find(v.begin(), v.end(), x);if (p != v.end()){p = v.insert(p, 40);(*(p + 1)) *= 10;}Cao::print_container(v);
}

对p这个迭代器进行修正,就得出了想要的结果。

因此在平时使用vector时,需要特别注意此类迭代器失效问题,因此的运行错误。 

相关文章:

  • LeetCode 2187.完成旅途的最少时间
  • linux操作命令(最常用)
  • ThinkPHP结合使用PHPConsole向Chrome 控制台输出SQL
  • 云XR(AR/VR)算力底座关键特征与技术路径
  • Kafka副本机制源码深度剖析:从数据同步到故障转移
  • ISO/IEC 8824规范实际应用案例
  • Java经典编程题
  • 进程间通信2(命名管道)linux
  • STM32 HAL 初始化I2C启动DS1307
  • 【Rust发邮件】Rust如何通过smtp协议发送邮件
  • 【FineDance】ModuleNotFoundError: No module named ‘smplx‘
  • Async、await是什么?跟promise有什么区别?使用的好处是什么
  • 常见误区解读之四:相较传统架构,超融合不够稳定?
  • matlab 求fir滤波器系数量化前和量化后的幅频响应对比图
  • 深度解析PECI:平台环境控制接口硬件架构
  • Transformer架构与注意力机制
  • springboot 常用各种注释的含义
  • 深度学习实战文档图像矫正
  • Ubuntu 多网卡安全路由配置(SSH 不断线版)
  • AWS CloudFormation深度解析:构建现代云原生应用基础设施
  • 宝鸡钛材产品网站建设/网络营销是以什么为中心
  • 微信平台软件开发/郑州网站seo优化公司
  • 台州手机模板建站/网络营销服务公司有哪些
  • 瑶海区网站建设/被忽悠去做网销了
  • 网站产品分类设计/公司企业网站建设方案
  • 北京企业信息/搜索引擎优化中的步骤包括