zoukankan      html  css  js  c++  java
  • vector迭代器失效的一种情形

    使用过STL的人都应该知道关于迭代器失效的原理,这里以后vector迭代器失效为例:

    第一种:当插入一个元素到vector中,如果插入后容器已满,那么容器将新开辟一块内存区域,然后

    将原内存中的数据拷贝到新的内存区域,同时释放旧的内存。这样之前指向旧内存的迭代器就会指向

    不确定内存,这块内存要么释放,要么释放后又用作其他用途。这便导致了迭代器失效。

    第二种:当删除容器中一个元素后,该迭代器所指向的元素已经被删除,那么也造成迭代器失效。

    这里我们主要讨论下第二种情况。

    我们先举个例子说明:

    比如vector中存储了1,2,3,4,5,6,7,8,9,10

    假如此时迭代器指向6.

    当我们erase这个迭代器的元素后,vecotr被删除元素后面的元素会依次前移动。

    变为1,2,3,4,5,7,8,9,10 此时迭代器指向元素7 也就是被删除元素的下一个元素。

    所以当我们用以下测试代码测试的时候,发现会出现错误:

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 int main(int argc, char* argv[])
     6 {
     7     std::vector<int> v1;
     8     for(int i = 1;i <= 10;i++)
     9     {
    10         v1.push_back(i);
    11     }
    12 
    13     for(vector<int>::iterator it = v1.begin();it != v1.end();)
    14     {
    15         if(*it==6)
    16         {
    17             v1.erase(it);
    18         }
    19         else
    20         {
    21             it++;
    22         }
    23     }
    24 
    25     for(it = v1.begin();it != v1.end();it++)
    26     {
    27         cout<<*it<<",";
    28     }
    29     cout<<endl;
    30     return 0;
    31 }

    因为删除元素的所指的迭代器已经失效

    但是由于erase方法会返回下一个有效的迭代器。所以

    我们再每次删除后让迭代器重新被erase返回即可。

    所以修改后的代码如下:

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 int main(int argc, char* argv[])
     6 {
     7     std::vector<int> v1;
     8     for(int i = 1;i <= 10;i++)
     9     {
    10         v1.push_back(i);
    11     }
    12 
    13     for(vector<int>::iterator it = v1.begin();it != v1.end();)
    14     {
    15         if(*it==6)
    16         {
    17             it=v1.erase(it);
    18         }
    19         else
    20         {
    21             it++;
    22         }
    23     }
    24 
    25     for(it = v1.begin();it != v1.end();it++)
    26     {
    27         cout<<*it<<",";
    28     }
    29     cout<<endl;
    30     return 0;
    31 }

    运行结果:

  • 相关阅读:
    转载:渗透利器-余弦
    搜索引擎?
    Gartner:用自适应安全架构来应对高级定向攻击
    内网渗透测试思路-FREEBUF
    渗透测试常规思路分析-FREEBUF
    SQLMAP使用笔记
    如何打造一款优秀的产品管理系统?
    阿里的钉钉能干掉腾讯的微信么?
    下一个亿万市场:企业级SaaS服务谁能独领风骚
    如何注册iClap账号?
  • 原文地址:https://www.cnblogs.com/vpoet/p/4667871.html
Copyright © 2011-2022 走看看