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


    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万时,设计排行榜的数据结构,和相关操作的算法?(伪代码表示)

  • 相关阅读:
    观《phonegap第三季 angularjs+ionic视频教程 实时发布》学习笔记(一)
    npm的本地模式与全局模式
    Nodejs的Express完成安装指导
    app安装位置声明
    vs2005水晶报表无法运行在X64机器上
    SQL递归查询(with cte as)
    System.IO.File.Create 不会自动释放,一定要Dispose
    imail 删除历史邮件命令
    Deferred解决JS同步问题
    HttpContext.Current.Cache使用文件依赖问题
  • 原文地址:https://www.cnblogs.com/danshui/p/2756456.html
Copyright © 2020-2023  润新知