迭代器的使用--关于迭代器的失效

这是程序员面试宝典上的一个小题。

要点是:使用erase之后迭代器失效。

实际上失效是指原来的迭代器,在删除一个元素之后,自动指向了下一个元素。

测试代码如下,删除容器中的值为6的所有元素。

A 错误的代码为:

  1. #include <iostream>
  2. #include <vector>
  3. usingnamespace std;
  4. void print(vector<int>);
  5. int main()
  6. {
  7. vector<int> array;
  8. array.push_back(1);
  9. array.push_back(6);
  10. array.push_back(6);
  11. array.push_back(3);
  12. vector<int> :: iterator itor;
  13. for (itor = array.begin(); itor != array.end(); itor++)
  14. {
  15. if (6 == *itor)
  16. {
  17. array.erase(itor);
  18. }
  19. }
  20. cout << "vector size is: " << array.size() << endl;
  21. for (itor = array.begin(); itor != array.end(); itor++)
  22. {
  23. cout << *itor << " " << endl;
  24. }
  25. return 0;
  26. }
#include <iostream>
#include <vector>

using namespace std;

void print(vector<int>);

int main()
{
        vector<int> array;
        array.push_back(1);
        array.push_back(6);
        array.push_back(6);
        array.push_back(3);
        vector<int> :: iterator itor;

        for (itor = array.begin(); itor != array.end(); itor++)
        {
                if (6 == *itor)
                {
                        array.erase(itor);
                }
        }

        cout << "vector size is: " << array.size() << endl;
        for (itor = array.begin(); itor != array.end(); itor++)
        {
                cout << *itor << " " << endl;
        }

        return 0;
}



 

输出的结果是:1, 6, 3.第二个6没有删除。

 

B 修改后的代码如下:

  1. #include <iostream>
  2. #include <vector>
  3. usingnamespace std;
  4. void print(vector<int>);
  5. int main()
  6. {
  7. vector<int> array;
  8. array.push_back(1);
  9. array.push_back(6);
  10. array.push_back(6);
  11. array.push_back(3);
  12. vector<int> :: iterator itor;
  13. for (itor = array.begin(); itor != array.end();)
  14. {
  15. if (6 == *itor)
  16. {
  17. array.erase(itor);
  18. }
  19. else
  20. itor++;
  21. }
  22. cout << "vector size is: " << array.size() << endl;
  23. for (itor = array.begin(); itor != array.end(); itor++)
  24. {
  25. cout << *itor << " " << endl;
  26. }
  27. return 0;
  28. }
#include <iostream>
#include <vector>

using namespace std;

void print(vector<int>);

int main()
{
        vector<int> array;
        array.push_back(1);
        array.push_back(6);
        array.push_back(6);
        array.push_back(3);
        vector<int> :: iterator itor;

        for (itor = array.begin(); itor != array.end();)
        {
                if (6 == *itor)
                {
                        array.erase(itor);
                }
                else
                        itor++;
        }

        cout << "vector size is: " << array.size() << endl;
        for (itor = array.begin(); itor != array.end(); itor++)
        {
                cout << *itor << " " << endl;
        }

        return 0;
}


结果是 1 ,3

 

可见,使用了erase之后,迭代器自动指向了下一个元素。

 

 

聚拓互联(http://www.ejutuo.com).Net平台至强虚拟主机供应商,是领先的互联网基础应用服务提供商,主要面向全球客户提供域名注册、国内、香港/美国虚拟主机、企业邮箱、智能建站、虚拟服务器(VPS)、服务器租用、服务器托管等丰富的网络产品服务。

聚拓互联的快速发展与其企业文化密不可分,易网人秉持“团结互助、敬业负责、恪守信誉、积极进取、勇于创新”的企业文化,汇聚了行业内的大量专业人士,拥有多位国内顶尖的linux/freeBSD/unix经验的系统工程师、微软认证工程师和网络安全技术人才。核心团队均为该行业从业多年的专业人士,拥有丰富行业经验和较高威望,并不断改革创新,以满足客户多元化需求为己任,不断进取。 同时,易网坚守 “专业品质、服务为本、诚信经营、恪守信誉”的核心价值观,为客户提供多样、安全、稳定、放心的产品。

posted on 2012-08-23 22:23  天外飞仙2  阅读(131)  评论(0)    收藏  举报

导航