【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析

03-27 1588阅读

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C++从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习C++

  🔝🔝


【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析

vector-下

  • 1. 前言
  • 2. 什么是迭代器失效?
  • 3. 迭代器失效的经典案例
  • 4. 迭代器失效的解决方案
  • 5. 对于reserve的深度剖析
  • 6. vector深浅拷贝问题
  • 7. vector深浅拷贝的解决方法
  • 8. 总结以及拓展

    1. 前言

    在阅读本篇文章前,一定要先看前集:

    vector深度剖析(上)

    本章重点:

    本章会重点讲解vector迭代器失效问题

    以及vector中的深浅拷贝问题

    并且简单完善一下vector的自我实现

    在此之前,我将在文章末尾把vector

    自我实现的完整代码分享给大家


    2. 什么是迭代器失效?

    首先我们要清楚一点:

    vector的每一次扩容都不是在

    原地扩容,而是新开辟一块儿空间后

    将原先的数据拷贝到新空间

    请看下面的代码:

    vector v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    auto pos = find(v.begin(),v.end(),3);
    v.insert(pos,30);
    v.insert(pos,40);
    

    这段代码在3前面插入一个30和40

    但是这段代码会出错!

    为什么呢?请看下图:

    【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析

    注:从四个数据插入为五个会扩容

    • 扩容前

      迭代器pos在start和finish之间

    • 扩容后

      start和finish的地址改变,pos失效

      pos不再指向现在的位置3

      迭代器失效的本质原因是:

      扩容后start和finish的地址发生变化

      指向原先位置的迭代器统统失效!

      若没发生扩容,则一切安好!


      3. 迭代器失效的经典案例

      除了前面讲到的insert导致迭代器失效外

      erase函数也会导致迭代器失效

      请看下面的案例:

      vector v;
      v.push_back(1);
      v.push_back(2);
      v.push_back(3);
      v.push_back(4);
      v.push_back(4);
      v.push_back(6);
      for (auto e : v)
      {
      	cout 
      	if (*it % 2 == 0)
      	{
      		it = v.erase(it);
      	}
      	++it;
      }
      for (auto e : v)
      {
      	cout 
      	it = insert(it,100);
      	it+=2;
      }
      for (auto e : v)
      {
      	cout 
      	if (*it % 2 == 0)
      	{
      		it = v.erase(it);
      	}
      	else
      	{
      		++it;
      	}
      }
      for (auto e : v)
      {
      	cout 
      	vv[i]=i;
      }
      
      	assert(pos 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]