您的位置:首页 > 编程语言 > C语言/C++

C++面试题:看代码找错—vector容器的使用

2013-11-03 20:28 253 查看
C++面试题:看代码找错—vector容器的使用
考点:理解vector容器的使用
出现频率:★★★★
        typedef vector IntArray;
        IntArray array;
        array.push_back( 1 );
        array.push_back( 2 );
        array.push_back( 2 );
        array.push_back( 3 );
        //删除array数组中所有的2
        for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
        {
                if( 2 == *itor ) 
                        array.erase( itor );
        }
解析:
这道题有两个错误。
(1)代码1行中没有使用类型参数,这将会导致编译错误。由于array需要添加int类型的元素,因此代码
1行定义vector时应该加上int类型。
        typedef vector<int> IntArray;
(2)代码8~12行的for循环,这里只能删除array数组中的第一个2,而不能删除所有的2。这是因为,每
次调用“array.erase( itor );”后,被删除元素之后的内容会自动往前移,导致迭代漏项,应在删除一
项后使itor--,使之从已经前移的下一个元素起继续遍历。
正确的程序如下:
        #include <iostream>
        #include <vector>
        using namespace std;
        
        int main()
        {
                typedef vector<int> IntArray;
                IntArray array;
                array.push_back( 1 );
                array.push_back( 2 );
                array.push_back( 2 );
                array.push_back( 3 );
                //删除array数组中所有的2
                for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
                {
                        if( 2 == *itor )
                        {
                                array.erase( itor );
                                --itor;  //删除一项后使itor--
                        }
                }
        
                //测试删除后array中的内容
                for(itor=array.begin(); itor!=array.end(); ++itor)
                {
                        cout << *itor << endl;
                }
        }
执行结果为:
        1
        3
答案:
(1)没有使用类型参数,会导致编译错误。
(2)只能删除array数组中的第一个2,而不能删除所有的2。因为每次调用“array.erase( itor );”后
,被删除元素之后的内容会自动往前移,导致迭代漏项

 

原文:http://genwoxuevc.blog.51cto.com/1852984/504092

本题是C++的一个很基础的问题,看过一些相关书籍,有一定的编程经验,即使不是C/C++也可以解决此问题,此问题的第二个错误类似与C#中的foreach中修改内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 挑错 vector