巨人网络2012年10月11日大连理工大学宣讲会C++开发工程师笔试题

时间:2022-04-11 14:41:40

1, char是一字节,int4字节,指针类型是4字节,代码如下:

Class  CTest

{

Public:

CTest():m_chData(‘\0’),m_nData(0)

{

}

Virtual void mem_fun(){}

 

private:

   char m_chData;

   int m_nData;

   static char s_chData; //

};

Char CTest::s_chData=’\0’;

 

问:(1)若按1字节对齐sizeof(CTest)的值是多少? 9

   (2)若按4字节对齐sizeof(CTest)的值是多少? 12

 

2. 下面代码存在哪些问题?

Class  IObject

{

};

class B:public IObject

{

public:

//constructor

public:

Int nB;

}

 

 

class C:public  IObject

{

public:

//constructor

public:

std::string strC;

};

int main()

{

std:;vector<IObject*>vecObjects;

vecObjects.push_back(new B);

vecObjects.push_back(new C);

C* pC=static_cast<C*>(vecObjects[0]);

std::cout<<”what will happen and why ?”<<pC->strC<<std:;end;

}

 

3.C++代码实现vector,list,map的循环删除操作。

vector中循环删除
很普通的算法,在一个循环中检查每个元素,判断条件,如果为真,就删除这个节点,再继续循环。看似简单,但是却一个不大不小的陷阱,这种小问题的结论,总是记不住,每次遇到的时候,都得写一个测试程序来验证,干脆总结一下,做个结论。
最简单的方法
std::remove_if(_First, _Last, Predicate) STL是用模板实现,简单高效,但是很多情况下,需要在循环中处理其他逻辑,不能直接使用这个函数
用erase删除 erase有两种原型,删除一个节点和区段删除,对于vector和list,这个操作的定义都是相同的 template< class _TYPE, class _A> iterator vector::erase(iterator Iterator );
1. 查看STL的源代码,这个函数返回的iterator,是指向下一个有效的节点,(如果没有,就指向end)
2. 注意这个定义,在for循环中不能再调用 it++,不然这样就等同于”it+=2〃。如果要想在循环中正确的遍历下去,必须要处理erase的返回值,因为调用 list::erase(iterator it)之后,it指向一个被销毁的值,再调用it++,就会内存异常
3. vector尽管没有这样的问题,但是在边界也会出现错误。
4. 正确的处理很简单:
iterator _Last = end();
for (iterator _First = begin(); _First != _Last; )
{
if (*_First == _Val)
_First = erase(_First);
else ++_First;
}

 

list:

for (pos=coll.begin(); pos !=coll.end(); ++pos)
{
   if ((*pos) == 't')
   {
       list<char>::iterator pos2;        //用pos2来保存pos指针
        pos2=pos;
        pos++;
        coll.erase(pos2);
   }
 }

 

循环删除vector和map中的元素

删除所有偶数项,并打印出删除的项
1. vector/queue
正确方法1:
void erase(vector<int> &v)
{
    for(vector<int>::iterator vi=v.begin();vi!=v.end();)
     {
        if(*vi % 2 == 0)
         {
             cout << "Erasing " << *vi << endl;
             vi = v.erase(vi);
         }
        else ++vi;
     }
}

正确方法2:
void erase2(vector<int> &v)
{
    for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();)
     {
        if(*ri % 2 == 0)
         {
             cout << "Erasing " << *ri << endl;
             v.erase((++ri).base());    //erase()函数期待的是正向iterator,故而这里要调
                                                    //用base()函数将逆向iterator转换为正向的
         }
        else ++ri;
     }
}



2.map/list
正确方法
void erase(map<int,int> &m)
{
    for(map<int,int>::iterator mi=m.begin();mi!=m.end();)
     {
        if(mi->second % 2 == 0)
         {
             cout << "Erasing " << mi->second << endl;
             m.erase(mi++);
         }
        else ++mi;
     }
}

 

 

5. 使用编译器编译源码分为哪几步?如果用联合编译来编译源码,哪些只能在本地执行,哪些能分发出去执行?

 

 

6.请用C++代码实现一个单例模式的例子。

1 template <typename T>
 2 class Singleton
 3 {
 4 public:
 5     static T& Instance()
 6     {
 7         if (m_pInstance == NULL)
 8         {
 9             Lock lock;
10             if (m_pInstance == NULL)
11             {
12                 m_pInstance = new T();
13                 atexit(Destroy);
14             }
15             return *m_pInstance;
16         }
17         return *m_pInstance;
18     }
19 
20 protected:
21     Singleton(void) {}
22     ~Singleton(void) {}
23 
24 private:
25     Singleton(const Singleton& rhs) {}
26     Singleton& operator = (const Singleton& rhs) {}
27 
28     void Destroy()
29     {
30         if (m_pInstance != NULL)
31             delete m_pInstance;
32         m_pInstance = NULL;
33     }
34 
35     static T* volatile m_pInstance;
36 };
37 
38 template <typename T>
39 T* Singleton<T>::m_pInstance = NULL;

 

7.C++中的空类,默认产生哪些类成员函数?请配合使用C++代码描述。

8.实现一个函数mymemcpy(void *dest,const void *src,size_t count),完成内存之间的拷贝。

  1. void *mymemcpy(void *dest, const void *src, unsigned int count)
  2. {   
  3.     assert((dest != NULL) && (src != NULL));   
  4.     void *address = dest;   
  5.     while (count --)   
  6.     {   
  7.         *(char *) dest = *(char *) src;   
  8.         dest = (char *) dest + 1;   
  9.         src = (char *) src + 1;   
  10.     }   
  11.     return address;   
  12. }   

 

 

9.Mysql相关操作

(1),显示当前数据库服务器中的数据列表:

mysql> show databases;

(2),显示数据库GAINT中的所有数据表:

mysql>using GAINT;  show tables;

(3),显示数据表ZT的结构:

mysql>dest ZT;

(4),建立数据库ZTGAME:

mysql>create database ZTGAME;

mysql>use ZTGAME;

(5),建立数据表CHARBASE包含两个长度为20的字符串字段(ID NAME):

mysql>

(6),用文本方式将数据/home/ztgame/data/123.txt装入数据表CHARBASE中:

mysql>load data local infile “/home/ztgame/data/123.txt” into table CHARBASE;

(7),导入/home/ztgame/data/123.sql文件命令:

mysql>source /home/ztgame/data/123.sql;

 

 

10.Internet采用哪种网络协议?该协议的主要层次结构?TCP/IP建立连接的过程?

11,尝试用多种方式实现死循环(c++代码)。

while(1)

{}

 

for(; ;)

{}

 

Loop:

gotoLoop;

 

_asm   

    next: 
     call   next 

12,为了方便,在类的构造函数里面直接使用memset(shis,0,sizeof(*this));语句来初始化整个类,问

(1)       这种写法,会有哪些弊端?

测试会将对象整体清空,包括虚表指针,从而后面所有方法函数调用都将无用,同时需要注意this指针会指向实际类,所以在父类中的该调用同样会清空整个子类。

(2)       具备何种特性的类可以采用这种写法?

 

13.设计一个排行榜,有N条记录(记录结构:排名,用户名,积分),积分大的排名靠前,需要提供一下操作:

1>某一个用户积分发生变化的时候,更新排行榜数据结构

2>使用用户名,获取用户排名

3>获取第n名用户名和积分

 

问题:

1>    dang N=1000时,请写出TopList类中未完成的成员函数?

struct UserInfo

{

string name;

long score;

 

bool operator<(const UserInfo& rhs)

{

1,______

}

};

 

struct TopList

{

public:

//刷新排行榜

bool Refresh TopList(const UserInfo& user)

{

2,______

}

//根据用户名活的用户排名

int GetRankByUserName(string& name)

{

3,______

}

//根据用户名次取得用户信息

UserInfo* GetUserByRank(long rank)

{

4,______

}

private:

std::multiset<UserInfo>items_;

};

 

2>当N=1000万时,设计排行榜的数据结构,和相关操作的算法?(伪代码表示)