读书人

几个C++的面试题小弟不会做。请

发布时间: 2012-02-19 19:43:37 作者: rapoo

几个C++的面试题,小弟不会做。请高手指点。
下面这段程序有什么作用?
#include <map>
struct A {int k;int j; };
struct A_Less{
inline bool operator()( const A& _a1 , const A& _a2 )const{return
(_a1.k*16+_a1.j)<(_a2.k*16+_a2.j);}};
std::map< A , void* , A_Less > A_map;

指出下面代码的错误(已包含相关文件)
struct B
{
int m_a;
B(){ memset(this , 0 , sizeof(B)) ; }virtual ~B(){};
};
答:

char* fun(){char sz[ 128 ];return sz; }
答:

std::list< int >g_IDList;
void DeleteIDFromList( int _ID )
{
std::list< int >::iterator itor= g_IDList.begin();
std::list< int >::iterator itor_e
= g_IDList.end();
for( ; itor != itor_e ; ++itor )
{
if( *itor == _ID ) { g_IDList.erase( itor ); }
}
}


[解决办法]
#include <map>
struct A { int k; int j; };
struct A_Less{
inline bool operator()( const A& _a1 , const A& _a2 )const{return
(_a1.k*16+_a1.j) <(_a2.k*16+_a2.j);}};
std::map < A , void* , A_Less > A_map;
答:创建一个map,元素排列以A_Less()作为标准

指出下面代码的错误(已包含相关文件)
struct B
{
int m_a;
B(){ memset(this , 0 , sizeof(B)) ; } virtual ~B(){};
};
答: memset函数会将虚函数指针被置成0

char* fun(){ char sz[ 128 ];return sz; }
答: 返回局部变量的地址

std::list < int > g_IDList;
void DeleteIDFromList( int _ID )
{
std::list < int > ::iterator itor = g_IDList.begin();
std::list < int > ::iterator itor_e
= g_IDList.end();
for( ; itor != itor_e ; ++itor )
{
if( *itor == _ID ) { g_IDList.erase( itor ); }
}
}
答:g_IDList.erase( itor );之后,itor已经指向“下一元素”,不需要在自加,
[解决办法]
第一个代码是首先A为结构体
而A_Less重载了操作符()且接受两个struct A类的参数并按这个两个结构体的值运算大小关系
std::map<A,void* ,A_Less> A_map(为了方便说,说到这个代码就用(1)代替) 是最核心的了
这是新建一个map类型 ,map 的关键值与 一个void* 一一对应,并且按关键值来排序,(10中的第三个参数是一个函数指针
用来接受两个A进行排序.
关于A_Less ,你可以直接这样用的 A a,b; bool sort=A_Less(a,b);

关于第二个代码,在struct中会有一个虚函数表的,大小为4字节,不信你可以用代码测试
sizeof(B)=8;
sizeof(int)=4;(本人用的是 VC windows xp平台)
在构造函数中用memset(this , 0 , sizeof(B)) 来初始化会把虚函数表的指针设为NULL,这样在析构这个结构体时就会出错的 测试代码 B *a=new B; delete a;
就会出错

第三个太简单了,不能返回局部变量的地址,我就不多说了

第四个代码 因为你删除元素后会使尾迭代器失效的,还没有研究过list的内部原理,这只是一个猜想,LZ可以测试一下,建议改代码为
std::list < int > g_IDList;
void DeleteIDFromList( int _ID )
{
std::list < int > ::iterator itor = g_IDList.begin();
for( ; itor != g_IDList.end(); ++itor )
{
if( *itor == _ID ) { g_IDList.erase( itor ); }
}
}


LZ的基本功还不行哦.加油啊

读书人网 >C++

热点推荐