• 向量容器2


    题3:

    以下代码有什么问题?如何修改?【中国某著名综合软件公司2005年面试题】

    // P96_example3.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <vector>
    
    void print(std::vector<int>);
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	std::vector<int> vec;
    	vec.push_back(1);
    	vec.push_back(6);
    	vec.push_back(6);
    	vec.push_back(3);
    	//删除vec数组中的所有6
    	std::vector<int>::iterator itor1;
    	std::vector<int>::iterator itor2;
    	for(itor1 = vec.begin(); itor1 != vec.end(); itor1++)
    	{
    		if(6 == *itor1)
    		{
    			itor2 = itor1;
    			vec.erase(itor2);	//删除指定位置的元素
    		}
    	}
    	print(vec);
    	return 0;
    }
    
    void print(std::vector<int> v)
    {
    	std::cout<<"vector size is: "<<v.size()<<std::endl;
    	std::vector<int>::iterator p = v.begin();
    	while(p != v.end())
    	{
    		std::cout<<*p<<std::endl;
    		p++;
    	}
    }
    


    解析:

    这是迭代器问题,只能删除第一个6,以后迭代器就失效了,不能删除之后的元素。

    itor2 = itor1;这句说明两个迭代器是一样的。vec.erase(itor2);等于vec.erase(itor1);,这时指针已经指向下一个元素了。itor1++;又自增了,指向了下一个元素3,略过了第二个6。

    答案:

    修改方法1:使用vector模版里面的remove函数进行修改,代码如下:

    // P96_example3.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    
    void print(std::vector<int>);
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	std::vector<int> vec;
    	vec.push_back(1);
    	vec.push_back(6);
    	vec.push_back(6);
    	vec.push_back(3);
    	//删除vec数组中的所有6
    	std::vector<int>::iterator itor1;
    	std::vector<int>::iterator itor2;
    	itor1 = vec.begin();
    	vec.erase(std::remove(vec.begin(),vec.end(),6),vec.end());
    	print(vec);
    	return 0;
    }
    
    void print(std::vector<int> v)
    {
    	std::cout<<"vector size is: "<<v.size()<<std::endl;
    	std::vector<int>::iterator p = v.begin();
    	while(p != v.end())
    	{
    		std::cout<<*p<<std::endl;
    		p++;
    	}
    }
    

    修改方法2:为了让其不略过第二个6,可以使itor1--,再回到原来的位置上。具体代码修改如下:

    // P96_example3.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <vector>
    
    
    void print(std::vector<int>);
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	std::vector<int> vec;
    	vec.push_back(1);
    	vec.push_back(6);
    	vec.push_back(6);
    	vec.push_back(3);
    	//删除vec数组中的所有6
    	std::vector<int>::iterator itor1;
    	std::vector<int>::iterator itor2;
    	itor1 = vec.begin();
    	for(itor1 = vec.begin(); itor1 != vec.end(); itor1++)
    	{
    		if(6 == *itor1)
    		{
    			itor2 = itor1;
    			vec.erase(itor2);	//删除指定位置的元素
    			itor1--;
    		}
    	}
    	print(vec);
    	return 0;
    }
    
    void print(std::vector<int> v)
    {
    	std::cout<<"vector size is: "<<v.size()<<std::endl;
    	std::vector<int>::iterator p = v.begin();
    	while(p != v.end())
    	{
    		std::cout<<*p<<std::endl;
    		p++;
    	}
    }
    



  • 相关阅读:
    剖析并利用Visual Studio Code在Mac上编译、调试c#程序【转】
    算法题—百灯判熄
    聪明的情侣算法题
    C#中&与&&的区别
    C# 日期格式精确到毫秒 【转】
    C#关于窗体的keysdown事件,无法获取到焦点
    百度,迅雷,华为,阿里巴巴笔试面试
    对 Linux 新手非常有用的 20 个命令
    阿里面试题2015
    Ant工具 ant的安装与配置 ant作用
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3167821.html
Copyright © 2020-2023  润新知