巨人网络2012年10月11日大连理工大学宣讲会C++开发工程师笔试题
1, 若char是一字节,int是4字节,指针类型是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),完成内存之间的拷贝。
- void *mymemcpy(void *dest, const void *src, unsigned int count)
- {
- assert((dest != NULL) && (src != NULL));
- void *address = dest;
- while (count --)
- {
- *(char *) dest = *(char *) src;
- dest = (char *) dest + 1;
- src = (char *) src + 1;
- }
- return address;
- }
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万时,设计排行榜的数据结构,和相关操作的算法?(伪代码表示)